如何在 Entity Framework 中计算 时间差 ?
生活随笔
收集整理的這篇文章主要介紹了
如何在 Entity Framework 中计算 时间差 ?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
咨詢區
ison
我的項目中有一個需求,需要使用 Entity Framework 實現 日期差 的計算邏輯,參考如下代碼:
var?now?=?DateTime.UtcNow;db.Items.OrderBy(x?=>?x.SomeInteger?+?(x.Date?-?now).Days);但很奇怪,上面的代碼會拋下面的錯誤:
The?LINQ?expression?'orderby'?could?not?be?translated?and?will?be?evaluated?locally.在 .NET Framework 中我可以通過 DbFunctions.DiffDays 來實現此需求, 但在 ASP.NET Core 中我該如何實現呢?
回答區
Stephen LAI:
在 github 上有一個 issue 就和你的問題相關,貌似在 2.1+ 后就已經修復了這個問題,github:https://github.com/dotnet/efcore/issues/10468
解決方案如下:
public?static?class?DbUtility {public?static?int?DateDiff(string?diffType,?DateTime?startDate,?DateTime?endDate){throw?new?InvalidOperationException($"{nameof(DateDiff)}?should?be?performed?on?database");} }然后修改 ApplicationDbContext 類。
protected?override?void?OnModelCreating(ModelBuilder?builder) {base.OnModelCreating(builder);builder.HasDbFunction(typeof(DbUtility).GetMethod(nameof(DbUtility.DateDiff))).HasTranslation(args?=>?{var?newArgs?=?args.ToArray();newArgs[0]?=?new?SqlFragmentExpression((string)((ConstantExpression)newArgs[0]).Value);return?new?SqlFunctionExpression("DATEDIFF",typeof(int),newArgs);}); }最后像下面這樣使用。
DbUtility.DateDiff("day",?x.DateAdded,?now)Stephen LAI:
在 ASP.NET Core 中你完全可以使用 SQL 提供的原生函數,由原來的 DbFunctions.DiffDays 改成 EF.Functions.DateDiffDay 即可, 參考如下代碼:
var?lstPeople?=?cxt .People.Where(p?=>?EF.Functions.DateDiffDay(p.Birth,?DateTime.Now)?>?0?) .ToList();點評區
其實用 EntityFramework 我還是那句話,如果你的項目業務復雜度不是很高的化,完全可以使用 EF 是一點問題都沒有的,一旦復雜度上去了,用 EF 反而是一種負擔,比如:100行的Linq 和 100行的sql ,哪一種會把你看暈呢?
總結
以上是生活随笔為你收集整理的如何在 Entity Framework 中计算 时间差 ?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# WPF MVVM开发框架Calib
- 下一篇: Win11用户增长迅速!你升了吗?