Можно ли преобразовать одно и то же выражение linq в другой оператор SQL в зависимости от БД? - PullRequest
2 голосов
/ 27 сентября 2019

Я работал над проектом ASP.NET MVC, в котором мы используем Informix DB и Entity Framework для наших запросов.Дело в том, что в зависимости от того, к какой БД приложение подключено, некоторые LINQ-запросы преобразуются в разные SQL-запросы.

То есть я подключаюсь к БД 1, и запрос работает и переводится более или менее так:

Opened connection asynchronously at 26/9/2019 12:48:27 +03:00
SELECT SKIP 0 FIRST 25 
...
FROM ( SELECT ...
    FROM ( SELECT 
        ...
        FROM   LATERAL (SELECT 
            ... ) AS Project1
        LEFT OUTER JOIN  LATERAL (SELECT  FIRST 1 Project2.C1 AS C1
            FROM  LATERAL ( SELECT 
                ...
            )  AS Project2
            ORDER BY ... ASC ) AS Limit1 ON 1 = 1 
    )  AS Project3
)  AS Project3
ORDER BY ...
-- p__linq__0: 'M' (Type = String, Size = 1)
-- p__linq__1: '1/1/2018 00:00:00' (Type = DateTime, Size = 16)
-- p__linq__2: '1/1/2019 00:00:00' (Type = DateTime, Size = 16)
-- Executing asynchronously at 26/9/2019 12:48:27 +03:00

с использованием того же точного кода я перезапускаю приложение и подключаюсь к БД 2, и такое же выражение LINQ преобразуется в следующий SQL-запрос, который завершается ошибкой:

Opened connection asynchronously at 26/9/2019 12:41:00 +03:00
SELECT SKIP 0 FIRST 25 
...
FROM ( SELECT ...
    FROM ( SELECT 
        ...
        FROM   (SELECT 
            ... ) AS Project1
        LEFT OUTER JOIN  (SELECT  FIRST 1 Project2.C1 AS C1
            FROM ( SELECT 
                ...
            )  AS Project2
            ORDER BY ... ASC ) AS Limit1 ON 1 = 1 
    )  AS Project3
)  AS Project3
ORDER BY ...
-- p__linq__0: 'M' (Type = String, Size = 1)
-- p__linq__1: '1/1/2018 00:00:00' (Type = DateTime, Size = 16)
-- p__linq__2: '1/1/2019 00:00:00' (Type = DateTime, Size = 16)
-- Executing asynchronously at 26/9/2019 12:41:00 +03:00
-- Failed in 403 ms with error: ERROR [IX000] [IBM][IDS/UNIX64] Column (...) not found in any table in the query (or SLV is undefined). 

Вы можетеобратите внимание, что во втором запросе отсутствует ключевое слово LATERAL .Возможно ли, что только подключенная БД влияет на преобразование LINQ в SQL?

отредактировать, чтобы ответить на вопросы: @Fildor БД не совпадают с версией:

- DB1 is IBM Informix Dynamic Server Version 12.10.FC6WE
- DB2 is IBM Informix Dynamic Server Version 12.10.FC10

@ Корак, насколько я знаю, схема БД относительно отсутствующего столбца одинакова в обоихDBS.Поскольку я не могу быть уверен на 100%, может ли это быть так?Однако есть все столбцы, если есть какая-либо разница, это будет во внешних ключах, т. Е. Дело в том, что два запроса абсолютно одинаковы, единственное отличие - ключевое слово LATERAL. Это документация IBM относительно ключевого слова LATERAL.Для меня имеет смысл, что без него «недостающий» столбец не может быть найден в подзапросе.

...