gpt4 book ai didi

c# - 如何使用 EF Core 2.2 将 JSON_VALUE 转换为 DateTime?

转载 作者:太空宇宙 更新时间:2023-11-03 22:33:03 26 4
gpt4 key购买 nike

我正在映射 JSON_VALUE使用来自 How to write DbFunction's translation 的技术.由于并非 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被直接调用,导致以下异常:

System.NotSupportedException HResult=0x80131515 Message=Specified method is not supported. StackTrace: at JsonExtensions.JsonValue(String column, String path) at System.Linq.Enumerable.WhereEnumerableIterator1.MoveNext()
at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.<_TrackEntities>d__17
2.MoveNext() at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()

为什么是DateTime行为不同于 int ?我能做些什么来制作 DateTime工作正常吗?

最佳答案

问题是不是所有的Convert方法都被支持。

事实上,它们都不是标准支持的 - EF Core 允许 database providers 添加 CLR 方法和成员翻译器,无论他们喜欢什么。例如 SqlServer 提供程序 currently supports ToByte, ToDecimal, ToDouble, ToInt16, ToInt32, ToInt64ToString

这意味着没有与数据库无关的方式来执行服务器端转换。

由于您似乎正在使用 SqlServer,作为解决方法,我可以建议通过使用我对 similar post 的回答中的“双重转换”技术来利用隐式数据转换(目前由 SqlServer 提供程序支持),例如

.Where(t1 => (DateTime)(object)JsonExtensions.JsonValue(t1.SampleJson, "$.samplePath.sampleDate") >= date);

(object) 强制转换用于避免 C# 编译器错误。在查询转换过程中,两种类型转换都将被删除,SQL Server 隐式数据转换最终将完成这项工作。

关于c# - 如何使用 EF Core 2.2 将 JSON_VALUE 转换为 DateTime?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56497947/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com