LEFT OUTER JOINを使用して、かなり標準的なLINQクエリから生成されたSQLに混乱が生じています。このクエリは、無料のTelerikオープンアクセス/データアクセス製品に対するものです。Telerik ORMに対するクエリLINQから生成されたSQL
私は
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;
... OUTERため、この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. };
は、私はSQL(ORACLE)は、次のようなものを見るために生成された期待していたのJOIN ...次LINQを書きました
しかし、私は出力をログイン時に代わりに私が...
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 2つの完全に分離したSELECT文があります。各テーブルには何百万ものレコードが含まれているため、おそらく最初のSELECTステートメントの結果に結合されたものだけでなく、2番目のテーブルのすべての内容が照会されているため、 。
生成されたSQLで実際のJOIN文が表示されないのはなぜですか?回避策がありますか、単に何か間違っていますか?答えを提供するためのEVKに
SOLUTION
感謝。問題はIQueryablesを定義する方法にあることが判明しました。私はDBContextコレクションへの参照を持つIQuaryablesではなく...
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の定義方法は? – Evk
headersQとbodyQはIQueryableです –
これらのクエリをテーブル定義だけで置き換えるとどうなりますか?私はちょうどcontext.TableNameを意味します。 – Evk