我在编写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查询。
为了测试的目的,format变量定义为:var format = new CultureInfo("hr-HR");
.
任何帮助都将非常感激。我使用的是EF Core 7.0和SQL Server。
在EFCore 7中,为CONVERT内置函数提供style
参数是不可能的。
您可以在这里查看哪些内置函数被翻译以及如何翻译。
你也可以看到这篇关于使用IMethodCallTranslator自己构建扩展的文章,尽管它是一个旧的(2019)。实际的EFCore CONVERT IMethodCallTranslator可以在这里找到。
仅供参考你可以(也许应该)使用DateTime的ToString
方法而不是CONVERT。它将在查询的最终选择(顶层投影)中工作得很好。