我正在尝试将DATEPART sql-server函数添加到实体框架核心,方法是将其作为静态方法添加到具有DbFunction属性的DbContext上,如这里所述的https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-2.0
问题在于,sql-server将日期部分参数作为字符串接收,并且无法运行它,因为日期部分参数不能是字符串(基于https://docs.microsoft.com/en-us/sql/t-sql/functions/datepart-transact-sql?view=sql-server-2017“注意,datepart不接受日期部分参数的用户定义变量等效项”)。
我还尝试通过执行sting.Replace("\"","")来删除传递给datepart的参数中的双引号,但仍然不起作用(它将参数从"'arg'“更改为'arg')
下面是我的代码:
[DbFunction("DATEPART","")]
public static int DATEPART(string datepart, DateTime date)
{
throw new NotSupportedException();
}是否有其他数据类型可以正常工作?我是不是遗漏了什么?
谢谢
发布于 2019-06-07 16:50:04
可以通过用DbFunctionAttribute包装日期部分SQL函数来使用它。棘手的部分是告诉ef core不要将datepart类型参数作为字符串处理。示例:
DbContext:
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]
}));
}查询:
repository.Where(x => dbContext.DatePart("weekday", x.CreatedAt) == DayOfWeek.Monday);更多信息:https://github.com/aspnet/EntityFrameworkCore/issues/10404
https://stackoverflow.com/questions/53937932
复制相似问题