我在编写EF Core表达式树代码时遇到了麻烦,该代码能够利用其内置CONVERT
函数(CONVERT( type[(length)], expression [, style])
-用于在将日期时间转换为字符串时应用样式)的所有3个参数转换为MS SQL Server查询。
我已经成功地编写了一个查询,它可以用SQL转换为CONVERT
,但只传递了2个参数:type
和expression
:
Expression.Convert(
Expression.Call(
typeof(Convert),
nameof(Convert.ToString),
Type.EmptyTypes,
Expression.PropertyOrField(parameter, prop.Name)
),
typeof(string)
);
但是,如果我尝试将IFormatProvider
与Convert.ToString()
方法一起使用(即传递以下参数:Expression.PropertyOrField(parameter, prop.Name)
之后的Expression.Constant(format, typeof(IFormatProvider))
,我收到异常,指出表达式无法转换为SQL查询。
出于测试目的,格式变量定义为:var format = new CultureInfo("hr-HR");
.
任何帮助将不胜感激。我使用EF核心7.0和SQL服务器。
1条答案
按热度按时间mrfwxfqh1#
从EFCore 7开始,无法为CONVERT内置函数提供
style
参数。您可以检查哪些内置函数被翻译以及如何翻译here。
你也可以在this post上看到使用IMethodCallTranslator来自己构建一个扩展,尽管它是一个旧的(2019)。实际的EFCore CONVERT IMethodCallTranslator可以在here上找到。
FYI除了CONVERT之外,您可以(或许应该)只使用DateTime的
ToString
方法,它在查询的最终选择(顶级投影)中工作得很好。