Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 同一个linq表达式能否根据数据库转换为不同的SQL语句?_C#_Linq_Informix_Entity Framework 6.2 - Fatal编程技术网

C# 同一个linq表达式能否根据数据库转换为不同的SQL语句?

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

我一直在从事一个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 
        ...
        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未定义)。
但是你忽略了它吗?