EF core 2.2 HasDbFunction генерирует плохие Oracle SQL - PullRequest
0 голосов
/ 18 февраля 2020

На многих веб-страницах рассказывается, как использовать функции БД, не встроенные в провайдера 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...