C# 基于Telerik ORM的LINQ查询生成的SQL
对于使用左外部联接的相当标准的LINQ查询生成的SQL,我感到有些困惑。该查询针对免费Telerik开放存取/数据存取产品 我写了下面的LINQC# 基于Telerik ORM的LINQ查询生成的SQL,c#,oracle,linq,telerik,telerik-open-access,C#,Oracle,Linq,Telerik,Telerik Open Access,对于使用左外部联接的相当标准的LINQ查询生成的SQL,我感到有些困惑。该查询针对免费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 sessio
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语法,我希望生成的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语句。由于每个表都包含数百万条记录,并且可能正在查询第二个表的所有内容,而不仅仅是与第一个SELECT语句的结果关联的内容,因此进行调用的组件在经过许多分钟的延迟后,最终由于内存问题而崩溃
为什么在生成的SQL中没有得到实际的JOIN语句?是否有解决方法或我只是做错了什么
解决方案
感谢EVK提供了答案。事实证明,问题出在我定义IQueryables的方式上。我用对DBContext集合的引用替换了IQueryables
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),因此在构建组合它们的单个查询时会遇到一些困难。因此,它没有抛出一些异常,而是做了一些不好的事情——将两个查询结果拉到内存中,并在内存中组合它们。还有headersQ和bodyQ是如何定义的?headersQ和bodyQ是iqueryable的如果仅用表定义替换这些查询会发生什么?我的意思是上下文。表名。同样的东西。。。事实上,bodyQ只不过是对DBContext.WiTransmitsVPMessages的引用。。。它从ORM上下文返回一个IQueryable。我收回它!!我只是稍微调整了一下查询,现在看到左连接如我所期望的那样出现。。。我的过滤器没有被应用,但这可能是另一篇文章。我已经在OP中添加了关于解决方案实现的更多细节。谢谢!!