【问题标题】:DatePart method in Entity Framework Core 3.0Entity Framework Core 3.0 中的 DatePart 方法
【发布时间】:2019-11-02 12:53:05
【问题描述】:

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 的结果对行进行分组。

【问题讨论】:

  • data.DateBooks.date 是不同类型的吗?并且数据库中Book表的date列不是DATE类型的?将模型属性上列的 SQL 数据类型设置为“DATE”是否有帮助?我不清楚为什么这里需要 TruncateTime()

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


【解决方案1】:

我从那个问题中学到了很多东西。以下 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

【讨论】:

  • 您好,谢谢您的回答。抱歉,我的问题可能有点不清楚,所以我正在编辑它。显示的代码只是一个小查询来测试它,但我真正需要的是在 DatePart 上使用 GroupBy。
猜你喜欢
  • 2020-03-19
  • 2020-05-23
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 2016-11-08
  • 2022-01-13
  • 2017-03-24
  • 2021-07-01
相关资源
最近更新 更多