我正在测绘JSON_VALUE
使用来自的技术如何编写DbFunction的翻译。由于 JSON 中并非所有值都是字符串,因此有时需要进行转换。
当转换为int
, 一切安好:
var results = context.Set<SampleTable>()
.Where(t1 => Convert.ToInt32(
JsonExtensions.JsonValue(t1.SampleJson, "$.samplePath.sampleInt")) > 1);
.ToList();
生成的 SQL 是:
SELECT *
FROM [SampleTable] AS [t1]
WHERE (CONVERT(int, JSON_VALUE([t1].[SampleJson], N'$.samplePath.sampleInt')) > 1)
然而,当转换为DateTime
,它不起作用:
DateTime date = new DateTime(2019, 6, 1);
var results = context.Set<SampleTable>()
.Where(t1 => Convert.ToDateTime(
JsonExtensions.JsonValue(t1.SampleJson, "$.samplePath.sampleDate")) >= date);
.ToList();
而不是被映射,JsonValue
直接调用,会出现如下异常:
系统不支持异常
H结果=0x80131515
消息=不支持指定的方法。
堆栈跟踪:
在 JsonExtensions.JsonValue(字符串列,字符串路径)
在 System.Linq.Enumerable.WhereEnumerableIterator1.MoveNext()
at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.<_TrackEntities>d__17
2.MoveNext()
在 Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()
Why is DateTime
行为方式不同于int
?我能做些什么来使DateTime
工作正常吗?
问题是并非所有Convert
方法均受支持。
事实上他们都不是标准地支持 - EF Core 允许数据库提供商根据需要添加 CLR 方法和成员转换器。例如SqlServer提供者目前支持 ToByte
, ToDecimal
, ToDouble
, ToInt16
, ToInt32
, ToInt64
and ToString
.
这意味着没有与数据库无关的方法来执行服务器端转换。
由于您似乎正在使用 SqlServer,作为解决方法,我建议使用implicit通过使用我的回答中的“双重转换”技术进行数据转换(当前由 SqlServer 提供程序支持)类似的帖子, e.g.
.Where(t1 => (DateTime)(object)JsonExtensions.JsonValue(t1.SampleJson, "$.samplePath.sampleDate") >= date);
(object)
Cast 用于避免 C# 编译器错误。在查询转换期间,这两种类型转换都将被删除,SQL Server 隐式数据转换最终将完成这项工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)