2016-11-11 48 views
1

我在使用LEFT OUTER JOIN从相当标准的LINQ查询生成的SQL上遇到了一些混淆。该查询是针对免费的Telerik Open Access/Data Access产品的。从Telerik ORM的LINQ查询中生成的SQL

我写了下面的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 OUTER JOIN我看到两个完全独立的SELECT语句。由于每个表包含MILLIONS个记录,并且可能会查询第二个表的所有内容,而不仅仅是连接到第一个SELECT语句的结果的那些内容,所以进行调用的组件最终会由于内存问题而崩溃,因为许多分钟的延迟。

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

SOLUTION

感谢EVK提供答案。事实证明,问题在于我定义IQueryables的方式。我换了IQuaryables与到的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 
+0

以及headerQ和bodyQ如何定义? – Evk

+0

headersQ和bodyQ是IQueryable

+1

如果您将这些查询替换为表定义会发生什么?我的意思只是context.TableName。 – Evk

回答

1

我的猜测是,headersQbodyQ代表的一些比较复杂的查询(可能不适合你,但是对于你使用的ORM),所以它有一些麻烦建立单一的查询结合起来。所以不是抛出一些异常,而是做一些不好的事情 - 将查询结果拉入内存并将它们结合在一起。

+0

我已经添加了更多关于OP解决方案实施的详细信息。谢谢!! –