近日處理我們公司某個使用 my sql 的專案,已經被雷的幾次,紀錄一下
1. 使用 EF Scaffolding 指令去更新 Model ,有些欄位原本是明確型別 變成 可null型別
也就是本來是 datetime 變成 datetime?, int 變成 int?
看起來是一些 view 的欄位會有這些狀況,這時就要去 git revert ,避免build專案又一堆錯誤
2. 使用 IQueryable 語法處理時間要小心,不要在裡面計算時間。
DateTime shouldBeGiveCoinDateTime = DateTime.Now.AddDays(-14);
return dbContext.ViewOrderForCoinCronJob.AsNoTracking().Where(x =>
x.CompletedAt <= shouldBeGiveCoinDateTime
&& x.CreatedAt >= DateTime.Now.AddYears(-1) // -> 這裡轉換mysql指令會出錯
&& x.DeletedAt == null
&& x.CoinAmount > 0
&& x.Status == (byte)ORDER_STATUS.COMPLETED
&& dbContext.PackingMain.Any(y => y.OrderId == x.Id)
&& x.IsGiveCoin != 0
&& !dbContext.CoinLog.Any(y =>
y.OrderId == x.Id
&& y.StrKey.Contains(COIN_LOG.STRING_KEY_PREFIX.ORDER_ACCUMULATION)
)
).ToList();
要把時間計算先算出來,再帶入式子
DateTime shouldBeGiveCoinDateTime = DateTime.Now.AddDays(-14);
DateTime createDateStartAt = DateTime.Now.AddYears(-1); // -> 先算出日期
return dbContext.ViewOrderForCoinCronJob.AsNoTracking().Where(x =>
x.CompletedAt <= shouldBeGiveCoinDateTime
&& x.CreatedAt >= createDateStartAt // -> 帶入算好的日期
&& x.DeletedAt == null
&& x.CoinAmount > 0
&& x.Status == (byte)ORDER_STATUS.COMPLETED
&& dbContext.PackingMain.Any(y => y.OrderId == x.Id)
&& x.IsGiveCoin != 0
&& !dbContext.CoinLog.Any(y =>
y.OrderId == x.Id
&& y.StrKey.Contains(COIN_LOG.STRING_KEY_PREFIX.ORDER_ACCUMULATION)
)
).ToList();