ASP .NET CORE

时间:2016-11-23 07:53:02

标签: asp.net linq sqlite asp.net-core entity-framework-core

我的.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,如果这有所作为。

6 个答案:

答案 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”。

您可以找到"Raw Sql Queries" here

的文档

此外,您还可以跟踪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

的更多详细信息