2 回答

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊
實(shí)際上支持DateTime.AddHours方法的翻譯。
問題是目前 EF Core 無法翻譯 的大部分(如果不是全部)成員DateTimeOffset,在這種特殊情況下 -DateTime屬性(與 等相同Offset)DateTimeUtc。
幸運(yùn)的是它確實(shí)支持DateTimeOffset比較的轉(zhuǎn)換,所以解決方案是換一種方式——將DateTime參數(shù)轉(zhuǎn)換為DateTimeOffset并在查詢中進(jìn)行簡(jiǎn)單的比較,例如
if (startDate != null)
{
// Note: must be a variable outside the query expression tree
var startDateOffset = new DateTimeOffset(startDate.Value);
items = items.Where(i => i.DateCreated >= startDateOffset);
}

TA貢獻(xiàn)1719條經(jīng)驗(yàn) 獲得超6個(gè)贊
更新的答案(EF Core):
根據(jù)此鏈接,DbFunctions
EF Core 當(dāng)前不支持。
如果您想AddHour
使用 EF Core 進(jìn)行調(diào)用,一種選擇是AddHour
在您的數(shù)據(jù)庫(kù)中定義為標(biāo)量函數(shù),然后您可以在您的 LINQ 查詢中調(diào)用它。
本文檔解釋了如何完成:
在您的 DbContext 上聲明一個(gè)靜態(tài)方法并使用以下注釋對(duì)其進(jìn)行注釋DbFunctionAttribute
:
public class MyDbContext : DbContext
{
[DbFunction]
public static int AddHours(DataTime source, int hours)
{
// you don't need any implementation
throw new Exception();
}
}
像這樣的方法會(huì)自動(dòng)注冊(cè)。注冊(cè)后,對(duì) LINQ 查詢中的方法的調(diào)用可以轉(zhuǎn)換為 SQL 中的函數(shù)調(diào)用:
items = items.Where(i =>
MyDbContext.AddHours(i.DateCreated, i.DateCreated.Offset.Hours) >= startDate.Value);
免責(zé)聲明:我個(gè)人不喜歡這個(gè)解決方案。編寫一個(gè)新方法,只是為了拋出一個(gè)異常,遠(yuǎn)不是一個(gè)優(yōu)雅的設(shè)計(jì)。不幸的是,如果您想使用 EF Core,您沒有太多選擇。
原始答案(EF 4/5/6):
AddHour不是您數(shù)據(jù)庫(kù)中的函數(shù)。它需要被翻譯成數(shù)據(jù)庫(kù)中相應(yīng)的功能。
如果您使用的是 SQL Server,那么您可以使用這段代碼,它將轉(zhuǎn)換AddHour為相應(yīng)的 DB 函數(shù):
items = items.Where(i =>
DbFunctions.AddHour(i.DateCreated, i.DateCreated.Offset.Hours) >= startDate.Value);
如果您不使用 SQL Server,那么您需要AddHour在您的數(shù)據(jù)庫(kù)中定義函數(shù),定義后您可以使用DbFunctions.AddHour, 來調(diào)用它。
- 2 回答
- 0 關(guān)注
- 135 瀏覽
添加回答
舉報(bào)