2016-11-11 37 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解決方案實施的詳細信息。謝謝!! –