我正在尝试将一些代码从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
});
答案 0 :(得分:5)
目前,不支持Sql Functions,这是打开的问题
以下是您可以尝试的一些替代方案:
答案 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