Entity Framework 6 - ORA-00932 при соединении с ToString - PullRequest
0 голосов
/ 25 июня 2018

Я тестирую Entity Framework 6.2 с базой данных Oracle, но сталкиваюсь с проблемами при попытке объединить несколько условий с преобразованием.

Мне нужно сопоставить TABLE2_ID (NUMBER) с TABLE2.ID (VARCHAR2), которые представляют собой различные типы значений. Проблема в том, что метод ToString() переводится в TO_NCLOB вместо TO_NCHAR, что сработает.

var query = from table1 in context.TABLE1
            join table2 in context.TABLE2 on table1.TABLE2_ID.ToString() equals table2.ID
            select  new
            {
                table1.NAME,
                table2.TEXT
            };

Сгенерированный SQL выглядит следующим образом:

SELECT 
1 AS "C1", 
"Extent1"."NAME" AS "NAME", 
"Extent2"."TEXT" AS "TEXT"
FROM  "USER"."TABLE1" "Extent1"
INNER JOIN "USER"."TABLE2" "Extent2" ON 
  (CASE WHEN ("Extent1"."TABLE2_ID" IS NULL) THEN N'' 

   // At this point I need TO_NCHAR
   ELSE TO_NCLOB("Extent1"."TABLE2_ID") END) = "Extent2"."ID"

В результате:

ORA-00932: несовместимые типы данных: ожидаемый NCHAR получил NCLOB

Я знаю, что есть много вопросов с почти одним и тем же исключением, но только с разными вариантами использования, поэтому, пожалуйста, посмотрите, как я могу решить эту проблему.
Например, Есть ли способ переопределить ToString() перевод SQL?

ОСНОВНАЯ ПРОБЛЕМА: LINQ to SQL .ToString() преобразуется в TO_NCLOB, но мне нужно TO_NCHAR или другое решение.

Я использую Visual Studio 2017 с Oracle Developer Tools для VS2017 12.2.0.11

1 Ответ

0 голосов
/ 05 июля 2018

К сожалению, .ToString() не так хорошо реализовано в Oracle Entity Framework.Таким образом, я получил обход этого ТАК принятого вопроса .Установка EntityFramework.Functions Nuget Package и использование TO_NCHAR встроенной функции Oracle сделали следующее:

public static class OracleFunctions
{
    [Function(FunctionType.BuiltInFunction, "TO_NCHAR")]
    public static string ToNChar(this string value) => Function.CallNotSupported<string>();
}

Переопределение OnModelCreating в DbContext:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Add(new FunctionConvention(typeof(OracleFunctions)));
}

И тогда я могу использоватьэто как то, что работает безупречно:

var query = from table1 in context.TABLE1
            join table2 in context.TABLE2 on table1.TABLE2_ID.ToNChar() equals table2.ID
            select  new
            {
                table1.NAME,
                table2.TEXT
            };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...