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