C# 同一个linq表达式能否根据数据库转换为不同的SQL语句?
我一直在从事一个ASP.NETMVC项目,其中我们使用InformixDB和实体框架进行查询。问题是,根据应用程序连接到哪个数据库,一些LINQ查询被转换为不同的SQL查询 也就是说,我连接到DB 1,查询正在工作,并被翻译成大致如下:C# 同一个linq表达式能否根据数据库转换为不同的SQL语句?,c#,linq,informix,entity-framework-6.2,C#,Linq,Informix,Entity Framework 6.2,我一直在从事一个ASP.NETMVC项目,其中我们使用InformixDB和实体框架进行查询。问题是,根据应用程序连接到哪个数据库,一些LINQ查询被转换为不同的SQL查询 也就是说,我连接到DB 1,查询正在工作,并被翻译成大致如下: Opened connection asynchronously at 26/9/2019 12:48:27 +03:00 SELECT SKIP 0 FIRST 25 ... FROM ( SELECT ... FROM ( SELECT
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
使用相同的代码重新启动应用程序并连接到DB 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和DBs的版本不完全相同:
- DB1 is IBM Informix Dynamic Server Version 12.10.FC6WE
- DB2 is IBM Informix Dynamic Server Version 12.10.FC10
@据我所知,关于缺少列的DB模式在两个DBs中是相同的。既然我不能百分之百肯定,那会是这样吗?但是,所有列都在那里,如果有任何差异,它将出现在外键中,也就是说,两个查询完全相同,唯一的差异是横向关键字。是IBM关于横向关键字的文档。对我来说,没有它,子查询中就找不到“缺失”列是有道理的。两个数据库都是相同的InformixDB版本?相同的设置,相同的表格?只有实际数据内容不同?“未找到错误[IX000][IBM][IDS/UNIX64]列(…)”——显然这两个数据库是不同的。您是否检查了关于上述列的差异?EF可以自由解释LINQ表达式(这是一件好事,因为在执行时有更多的信息可以进行更优化的查询),因此不必总是使用相同的LINQ生成相同的SQL。旁注:即使是相同的SQL语句也可能导致服务器上的执行计划不同,这通常也是一件好事,因为服务器通常有更多关于DB当前状态的信息(统计信息)来进行判断调用。这也可能是非常非常错误的,虽然…你没有太多的意义。。。如果它是相同的linq,那么不管链接如何,它都会产生相同的linq,否则你会得到一个错误,包括linq。这就像它告诉你什么是错误的
列(…),在查询中的任何表中都找不到(或者SLV未定义)。
但是你忽略了它吗?