На многих веб-страницах рассказывается, как использовать функции БД, не встроенные в провайдера EF SQL (большинство вопросов касаются json_value).
Поэтому я пытаюсь использовать решение, которое может можно найти "везде" в MVC Core 2.2 с проектом EF с Oracle:
Startup.cs:
services.AddDbContext<OracleContext>(options => options.UseOracle(Configuration.GetConnectionString("OracleConnection")));
OracleContext.cs:
modelBuilder.HasDbFunction(typeof(JsonExtensions).GetMethod(nameof(JsonExtensions.JsonValue)))
.HasName("JSON_VALUE")
.HasSchema("");
JsonExtensions.cs:
public static class JsonExtensions
{
public static string JsonValue(string column, [NotParameterized] string path)
{
throw new NotSupportedException();
}
}
, а затем использование
var result = context.MyTable.Where(t => JsonExtensions.JsonValue(t.Json, "$.Task") == "Work" ).ToArray();
дает мне исключение oracle. Сгенерировано SQL:
SELECT "t"."MYRECORDID", "t"."JSON" FROM "SCHEMA"."MYTABLE" "t" WHERE "JSON_VALUE"("t"."JSON", N'$.Task') = N'Work'
С этим связано 2 проблемы.
Во-первых, он выдает ORA-40449: «недопустимый тип данных для возвращаемого значения»
Эту проблему можно решить, убрав двойные кавычки вокруг имени функции:
SELECT "t"."MYRECORDID", "t"."JSON" FROM "SCHEMA"."MYTABLE" "t" WHERE JSON_VALUE("t"."JSON", N'$.Task') = N'Work'
Затем выдается ORA-40442: "JSON синтаксис выражения пути ошибка "JZN-00208: путь должен начинаться со знака доллара ($) . Я могу избавиться от него, удалив N из буквального параметра N '$. Задача'
SELECT "t"."MYRECORDID", "t"."JSON" FROM "SCHEMA"."MYTABLE" "t" WHERE JSON_VALUE("t"."JSON", '$.Task') = N'Work'
Это работает и дает ожидаемый результат.
Так как я могу сказать EF не включить двойные кавычки вокруг имени функции и не помещать N перед вторым параметром JSON_VALUE?