我的.net应用程序中有以下功能的LINQ
public ActionResult Index()
{
Dictionary<DateTime?, List<Event>> result;
result = (from events in db.Events.Include("Activity")
where events.IsActive
group events by DbFunctions.TruncateTime(events.DateTimeFrom) into dateGroup
select new { EventDate = dateGroup.Key, Events = dateGroup.ToList() }).ToDictionary(x => x.EventDate, x => x.Events);
return View(result);
}
字符串
当我在EF Core中使用它时,我不能使用DbFunctions。我如何重写它以使其在Microsoft. MicrosoftFrameworkCore中工作?如果有区别,我使用SQLite。
7条答案
按热度按时间esyap4oy1#
在EF 6中,使用
DbFunctions.TruncateTime
而不是DateTime.Date
属性,因为出于某种原因,后者不受支持。在EF Core中,不需要前者,因为
DateTime.Date
现在可以被正确识别和翻译。字符串
不幸的是,还没有文档说明支持什么,所以作为一个一般的经验法则,总是尝试相应的SQL方法/属性(如果有的话),并检查它是否转换为SQL以及如何转换。
au9on6nz2#
若要在ASP.NETCORE中使用DbFunctions,必须创建一个对象。
字符串
现在你可以很容易地使用它。
型
关于github的更多信息
5ktev3wc3#
EF Core还不支持DbFunctions。但是你可以使用“Raw Sql函数”。
您可以找到"Raw Sql Queries" here的文档
您还可以跟踪EF Core的DbFunctions的here
pzfprimi4#
EF Core 3.0
我终于找到了一个有效的答案。问题是我想在数据库中的DateTime列上按日期分组。
对我来说,关键是使用EF.Property函数。这允许类具有用于添加该级别数据的DateTime属性,但下面允许我将其重新定义为Date。然而..我怀疑如果我在类上声明属性,它已经允许我使用.Date函数,而它不允许我这样做。
因此,解决方案可能是在模型上定义属性,或者在查询中使用下面的定义。
EF.Property(s,“dt”).Date
完整代码
字符串
liwlm1x95#
在我的例子中,它以这种方式工作,而不是DbFunctions.TruncateTime或DbFunctions.TruncateTime-
字符串
它首先在服务器端的where条件下转换日期,然后与参数日期值进行比较-
型
zaqlnxep6#
我也设法用Lambda重写了这个,并使它成为Lambda。似乎工作原理是一样的。
字符串
gzjq41n47#
EF Core 2.0现在支持将数据库函数Map到上下文中的静态方法。
查看“数据库标量函数Map”一节-https://learn.microsoft.com/en-us/ef/core/what-is-new/