我的.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);
}
当我在ASP .NET CORE中使用它时,我不能使用DbFunctions。我如何重写它以使其在Microsoft.EntityFrameworkCore中工作?我正在使用SQLite,如果这有所作为。
答案 0 :(得分:25)
在EF6中使用DbFunctions.TruncateTime
代替DateTime.Date
属性,因为出于某种原因,后者不受支持。
在EF Core中,不需要前者,因为现在可以正确识别和翻译DateTime.Date
。
group events by events.DateTimeFrom.Date into dateGroup
不幸的是,还没有支持的文档,所以作为一般的经验法则,总是尝试相应的CLR方法/属性(如果有的话)并检查它是否转换为SQL以及如何。
答案 1 :(得分:3)
EF Core尚不支持DbFunction。但是,您可以使用“Raw Sql Queries”。
的文档此外,您还可以跟踪here获取EF Core的DbFunction
答案 2 :(得分:3)
EF Core 3.0
我终于找到了一个可行的答案。问题是我想在数据库的DateTime列上按日期分组。
对我来说,关键是使用EF.Property函数。这使该类具有DateTime属性,该属性用于添加该级别的数据,但在下面允许我将其重新定义为Date。但是..我怀疑如果我将该类的属性声明为十进制,那么它本来可以允许我使用不允许执行的.Date函数。
因此,解决方案可能是在模型上定义属性,或者使用以下内容在查询中定义属性。
EF.Property(s,“ dt”)。Date
完整代码
var myData = _context.ActivityItems
.GroupBy(a => new { nlid = a.lid, nsd = EF.Property<DateTime>(a, "dt").Date })
.Select(g => new
{
g.Key.nlid,
g.Key.nsd,
cnt = g.Count()
});
答案 3 :(得分:0)
我设法在Lambda中重写它并使其异步。似乎工作原理相同。
var temp = await _context.Events.Where(x => x.IsActive)
.Include(a => a.Activity)
.GroupBy(x => x.DateTimeFrom.Date)
.Select(g => new { EventDate = g.Key, Events = g.ToList() }).ToDictionaryAsync(x => x.EventDate, x => x.Events);
答案 4 :(得分:0)
EF Core 2.0现在支持将数据库函数映射到上下文中的静态方法。
在此处查看“数据库标量函数映射”部分 - https://docs.microsoft.com/en-us/ef/core/what-is-new/
答案 5 :(得分:0)
要在ASP.NET中使用DbFunctions,您必须创建一个对象。
var DbF = Microsoft.EntityFrameworkCore.EF.Functions;
现在您可以轻松使用它。
var now = DateTime.Now;
int count = db.Tbl.Count(w => DbF.DateDiffDay(now, w.RegisterDate) <= 3);
有关github
的更多详细信息