asp.net - Entity Framework Core 3.0 中的 DatePart 方法
问题描述
如何在 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 的结果对行进行分组。
解决方案
我从那个问题中学到了很多东西。以下 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
推荐阅读
- c++ - 巨大的内存分配:堆栈与堆
- spring - 使用响应式数据库编写业务逻辑
- c# - Xamarin Android 进度条
- c# - 如果超过 50 行,Xamarin Forms 在节点后端上拉异步失败
- javascript - 如果内容匹配,则在输入前搜索
- mysql - 在mysql中聚合和计算值
- c# - AspNet Core 范围依赖接口隔离
- java - Apache POI:XWPFDocument 如何将带有注释的文本从一个文档复制到另一个文档
- pdf - 无法使用 Adobe Acrobat 打开 PDF 文件
- hyperledger-fabric - 超级账本结构的链码(智能合约)的安全问题