Я сопоставляю 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
вызывается напрямую, что приводит к следующему исключению:
System.NotSupportedException HResult=0x80131515 Сообщение=Указанный метод не поддерживается. StackTrace: в JsonExtensions.JsonValue (столбец String, путь строки) в System.Linq.Enumerable.WhereEnumerableIterator
1.MoveNext() at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.<_TrackEntities>d__17
2.MoveNext() в Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()
Почему DateTime
ведет себя иначе, чем int
? Что я могу сделать, чтобы DateTime
работал правильно?