2

我一直在研究一个 ASP.NET MVC 项目,我们在其中使用 Informix DB 和 Entity Framework 进行查询。问题是,根据应用程序连接到的数据库,一些 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关键字。是否可能只是连接的数据库会影响到 SQL 的 LINQ 转换?

编辑回答问题:@Fildor 数据库不是完全相同的版本:

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

@Corak 据我所知,关于缺失列的数据库架构在两个数据库中是相同的。既然我不能百分百确定,那会是这样吗?但是,所有列都在那里,如果有任何差异,它将在外键中,即问题是这两个查询完全相同,唯一的区别是 LATERAL 关键字。是 IBM 关于 LATERAL 关键字的文档。对我来说,没有它,在子查询中找不到“缺失”列是有道理的。

4

0 回答 0