DbFunctions. EF CORE中的TruncateTime LINQ等效函数

6jygbczu  于 2024-01-03  发布在  其他
关注(0)|答案(7)|浏览(152)

我的.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。

esyap4oy

esyap4oy1#

在EF 6中,使用DbFunctions.TruncateTime而不是DateTime.Date属性,因为出于某种原因,后者不受支持。
在EF Core中,不需要前者,因为DateTime.Date现在可以被正确识别和翻译。

group events by events.DateTimeFrom.Date into dateGroup

字符串
不幸的是,还没有文档说明支持什么,所以作为一个一般的经验法则,总是尝试相应的SQL方法/属性(如果有的话),并检查它是否转换为SQL以及如何转换。

au9on6nz

au9on6nz2#

若要在ASP.NETCORE中使用DbFunctions,必须创建一个对象。

var DbF = Microsoft.EntityFrameworkCore.EF.Functions;

字符串
现在你可以很容易地使用它。

var now = DateTime.Now;

int count = db.Tbl.Count(w => DbF.DateDiffDay(now, w.RegisterDate) <= 3);


关于github的更多信息

5ktev3wc

5ktev3wc3#

EF Core还不支持DbFunctions。但是你可以使用“Raw Sql函数”。
您可以找到"Raw Sql Queries" here的文档
您还可以跟踪EF Core的DbFunctions的here

pzfprimi

pzfprimi4#

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()
                            });

字符串

liwlm1x9

liwlm1x95#

在我的例子中,它以这种方式工作,而不是DbFunctions.TruncateTime或DbFunctions.TruncateTime-

result = _context.ActivityItems.Where(a =>  a.DateTimeFrom.Value.Date == paramFilter.DateTimeFrom.Value.Date);

字符串
它首先在服务器端的where条件下转换日期,然后与参数日期值进行比较-

WHERE CONVERT(date, [a].[DateTimeFrom]) = @__paramFilter_DateTimeFrom_Value_Date_0

zaqlnxep

zaqlnxep6#

我也设法用Lambda重写了这个,并使它成为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);

字符串

gzjq41n4

gzjq41n47#

EF Core 2.0现在支持将数据库函数Map到上下文中的静态方法。
查看“数据库标量函数Map”一节-https://learn.microsoft.com/en-us/ef/core/what-is-new/

相关问题