可以通过使用 DbFunctionAttribute 包装 datepart SQL 函数来使用它。
棘手的部分是告诉 ef core 不要将 datepart 类型参数作为字符串处理。示例:
DbContextef core <= 2.1:
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]
}));
}
DbContext ef core >= 3.1(静态 SqlFunctionExpression.Create 调用而不是 ctor):
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 => SqlFunctionExpression.Create(nameof(DatePart), new[]
{
new SqlFragmentExpression(args.ToArray()[0].ToString()),
args.ToArray()[1]
}, typeof(int?), null));
}
查询:
repository.Where(x => dbContext.DatePart("week", x.CreatedAt) > 10);
更多信息:https://github.com/aspnet/EntityFrameworkCore/issues/10404
注意不要在 DbContext 的接口上调用 DbFunction 方法。调用必须直接在 DbContext 实例上发生。
编辑:对于ef core 3.1,您可以使用静态方法SqlFunctionExpression.Create 而不是ctor: