首页 > 解决方案 > Entity Framework Core 3.0 中的 DatePart 方法

问题描述

如何在 Entity Framework Core 3.0 中使用DatePartTruncateTime等方法?例如,在 Entity Framework 6.3.0 中可以调用

DbFunctions.TruncateTime

但现在没有这样的方法。我发现可以使用下面显示的代码完成类似的操作,但由于 SqlFragmentExpression 的构造函数是内部的,因此我无法让它工作:

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

这是我试图开始工作的一个简单的 LINQ 查询:

context.Books.Any(x => DbFunctions.TruncateTime(x.date) == data.Date);

有没有其他方法可以做到这一点,或者至少有人在努力添加这些功能?


编辑 1

为了澄清我的问题 - 之后我需要按 DatePart 的结果对行进行分组。

标签: asp.netentity-frameworkasp.net-core.net-core

解决方案


我从那个问题中学到了很多东西。以下 linq 语句应该适合您:

context.Books.Any(x => x.date.Date == data.Date);

但是某些功能可以从 EF 核心访问。例如:

var dbf = EF.Functions;
_DB.Books.Any(x => EF.Functions.Contains(x.Name, "Galaxy"));

自 EF 核心 2.0 以来还有一个标量函数映射功能,允许将 Linq 函数映射到标量数据库函数。请参阅https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-2.0


推荐阅读