首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF核心将sql server DATEPART实现为DbFunction静态方法

EF核心将sql server DATEPART实现为DbFunction静态方法
EN

Stack Overflow用户
提问于 2018-12-27 06:44:28
回答 1查看 901关注 0票数 0

我正在尝试将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')

下面是我的代码:

代码语言:javascript
复制
[DbFunction("DATEPART","")]
public static int DATEPART(string datepart, DateTime date)
{
    throw new NotSupportedException();
}

是否有其他数据类型可以正常工作?我是不是遗漏了什么?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-07 16:50:04

可以通过用DbFunctionAttribute包装日期部分SQL函数来使用它。棘手的部分是告诉ef core不要将datepart类型参数作为字符串处理。示例:

DbContext:

代码语言:javascript
复制
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]
                }));
}

查询:

代码语言:javascript
复制
repository.Where(x => dbContext.DatePart("weekday", x.CreatedAt) == DayOfWeek.Monday);

更多信息:https://github.com/aspnet/EntityFrameworkCore/issues/10404

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53937932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档