SQL Server EF核心表达式树CONVERT

yc0p9oo0  于 2023-01-01  发布在  其他
关注(0)|答案(1)|浏览(154)

我在编写EF Core表达式树代码时遇到了麻烦,该代码能够利用其内置CONVERT函数(CONVERT( type[(length)], expression [, style])-用于在将日期时间转换为字符串时应用样式)的所有3个参数转换为MS SQL Server查询。
我已经成功地编写了一个查询,它可以用SQL转换为CONVERT,但只传递了2个参数:typeexpression

Expression.Convert(
    Expression.Call(
        typeof(Convert),
        nameof(Convert.ToString),
        Type.EmptyTypes,
        Expression.PropertyOrField(parameter, prop.Name)
    ),
    typeof(string)
);

但是,如果我尝试将IFormatProviderConvert.ToString()方法一起使用(即传递以下参数:Expression.PropertyOrField(parameter, prop.Name)之后的Expression.Constant(format, typeof(IFormatProvider)),我收到异常,指出表达式无法转换为SQL查询。
出于测试目的,格式变量定义为:var format = new CultureInfo("hr-HR");.
任何帮助将不胜感激。我使用EF核心7.0和SQL服务器。

mrfwxfqh

mrfwxfqh1#

从EFCore 7开始,无法为CONVERT内置函数提供style参数。
您可以检查哪些内置函数被翻译以及如何翻译here
你也可以在this post上看到使用IMethodCallTranslator来自己构建一个扩展,尽管它是一个旧的(2019)。实际的EFCore CONVERT IMethodCallTranslator可以在here上找到。
FYI除了CONVERT之外,您可以(或许应该)只使用DateTime的ToString方法,它在查询的最终选择(顶级投影)中工作得很好。

相关问题