Можно ли преобразовать одно и то же выражение linq в другой оператор SQL в зависимости от БД?
Я работал над проектом 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
@Corak, насколько мне известно, схема БД в отношении отсутствующего столбца одинакова в обеих БД. Хотя я не могу быть уверен на 100%, может ли это быть так? Однако все столбцы есть, если есть какая-то разница, она будет во внешних ключах, т.е. дело в том, что два запроса точно такие же, с той лишь разницей, что ключевое слово LATERAL. Это документация IBM относительно ключевого слова LATERAL. Мне кажется логичным, что без этого столбец "недостающий" не может быть найден в подзапросе.