【发布时间】:2019-11-02 12:53:05
【问题描述】:
Entity Framework Core 3.0中如何使用DatePart或TruncateTime等方法?例如,在 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.Date 和 Books.date 是不同类型的吗?并且数据库中Book表的date列不是DATE类型的?将模型属性上列的 SQL 数据类型设置为“DATE”是否有帮助?我不清楚为什么这里需要 TruncateTime()。
标签: asp.net entity-framework asp.net-core .net-core