使用EntityFramework Core和linq to entities将服务器端的日期与今天进行比较

时间:2016-04-11 16:06:56

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

我正在尝试将一些代码从EF6转换为EF Core 1 RC1,而我仍然停留在需要使用linq在服务器端将日期与当前日期进行比较的时刻。查询的另一部分是获取这些日期的星期几。 EF6代码使用完全限定为System.Data.Entity.SqlServer.SqlFunctions的SqlFunctions类,即afaik尚未移植到新版本。 什么是推荐的方法或替代方案,以保持这在EF核心上工作?

原始linq to entities查询是这样的:

var result = db.Logs.Select(log => new {
      Date = log.Date,
      Rel = System.Data.Entity.SqlServer.SqlFunctions.DateDiff("day", log.Date, System.Data.Entity.SqlServer.SqlFunctions.GetDate()),
      Dow = System.Data.Entity.SqlServer.SqlFunctions.DatePart("dw", log.Date) - 1 
});

2 个答案:

答案 0 :(得分:5)

目前,不支持Sql Functions,这是打开的问题

Provide standard LINQ methods that correspond to standard SQL operations (something like DbFunctions from EF6)

以下是您可以尝试的一些替代方案:

答案 1 :(得分:0)

可以通过将日期部分SQL函数与DbFunctionAttribute包装在一起来使用它。 datediff等也可以使用。 棘手的部分是告诉ef核心不要将datepart类型参数作为字符串处理。示例:

DbContext:

public int? DatePart(string datePartArg, DateTime? date) => throw new Exception();

public void OnModelCreating(DbModelBuilder modelBuilder) {
    var methodInfo = typeof(DbContext).GetRuntimeMethod(nameof(DatePart), new[] { typeof(string), typeof(DateTime) });
    modelBuilder
        .HasDbFunction(methodInfo)
        .HasTranslation(args => new SqlFunctionExpression(nameof(DatePart), typeof(int?), new[]
                {
                        new SqlFragmentExpression(args.ToArray()[0].ToString()),
                        args.ToArray()[1]
                }));
}

查询:

repository.GroupBy(x => dbContext.DatePart("week", x.CreatedAt));

更多信息:https://github.com/aspnet/EntityFrameworkCore/issues/10404