我在使用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
以及headerQ和bodyQ如何定義? – Evk
headersQ和bodyQ是IQueryable –
如果您將這些查詢替換爲表定義會發生什麼?我的意思只是context.TableName。 – Evk