基于Telerik ORM的LINQ查询生成的SQL

本文关键字:SQL 查询 LINQ Telerik ORM 基于 | 更新日期: 2023-09-27 18:17:24

我在使用LEFT OUTER JOIN的相当标准的LINQ查询生成的SQL上遇到了一些困惑。该查询是针对Free Telerik开放访问/数据访问产品的。

我写了下面的LINQ…

01.var sessionQ = from sessionHdr in headersQ
02.   join sessionBody in bodyQ on
03.        sessionHdr.ID equals sessionBody.ID into sessionList
04.   from sessionJSON in sessionList.DefaultIfEmpty()
05.   where sessionHdr.Format == 13
06. 
07.   select new WITransmitsVP
08.   {
09.      ...
10.   };

使用这个LINQ语法的OUTER JOIN,我期望生成的SQL (ORACLE)看起来像下面这样…

1.SELECT
2.    ...
3. 
4.FROM "XFEVP"."WI_TRANSMITS_VP" a
5.    INNER JOIN "XFEVP"."WI_TRANSMITS_VP_MSG" b ON
6.      a."MESSAGE_ID" = b."MESSAGE_ID"
7.WHERE a."MESSAGE_ID" = 60412762;

但是当我记录输出时,我看到的是…

01.SELECT
02.    ...
03. 
04.FROM "XFEVP"."WI_TRANSMITS_VP" a
05.WHERE a."MESSAGE_ID" = :p0                                      
06.ORDER BY COL1 
07. 
08.SELECT
09.    ...
10. 
11.FROM "XFEVP"."WI_TRANSMITS_VP_MSG" a
12.ORDER BY COL1

我看到的是两个完全独立的SELECT语句,而不是单个SELECT和OUTER JOIN。由于每个表包含数百万条记录,并且可能正在查询第二个表的所有内容,而不仅仅是那些与第一个SELECT语句的结果连接的内容,因此在许多许多分钟的延迟后,发出调用的组件最终由于内存问题而崩溃。

为什么在生成的SQL中没有得到实际的JOIN语句?是否有解决方法或我只是做错了什么?

<

解决方案/strong>

感谢EVK提供的答案。问题出在我定义IQueryables的方式上。我把IQueryables换成了对DBContext集合的引用…

01.var sessionQ = from sessionHdr in DBContext.SessionHeaders
02.   join sessionBody in DBContext.SessionBodies on
03.        sessionHdr.ID equals sessionBody.ID into sessionList
04.   from sessionJSON in sessionList.DefaultIfEmpty()
05.   where sessionHdr.Format == 13
06. 
07.   select new WITransmitsVP
08.   {
09.      ...
10.   };

这导致生成如下SQL…

SELECT 
    ...
FROM "XFEVP"."WI_TRANSMITS_VP" a 
    LEFT JOIN "XFEVP"."WI_TRANSMITS_VP_MSG" b ON 
        (a."MESSAGE_ID" = b."MESSAGE_ID") 
WHERE a."FORMAT" = :p0

基于Telerik ORM的LINQ查询生成的SQL

我的猜测是headersQbodyQ表示一些相对复杂的查询(可能不适合您,但对于您使用的ORM),因此在构建组合它们的单个查询时遇到一些麻烦。因此,它没有抛出一些异常,而是做了一些不好的事情-将两个查询结果拉到内存中并将它们组合在一起。