2016-11-11 8 views
1

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 
+0

また、headersQとbodyQの定義方法は? – Evk

+0

headersQとbodyQはIQueryableです

+1

これらのクエリをテーブル定義だけで置き換えるとどうなりますか?私はちょうどcontext.TableNameを意味します。 – Evk

答えて

1

私の推測では、headersQbodyQは比較的いくつかを表していることだろう複雑なクエリ(多分あなたのためではなく、あなたが使用するORMのため)、そしてそれはそれらを組み合わせる単一のクエリを構築するいくつかの問題を抱えています。だから、いくつかの例外を投げるのではなく、何か悪いことをする - 両方のクエリ結果をメモリにプルし、そこにそれらを結合する。

+0

私はOPへのソリューションの実装についての詳細を追加しました。ありがとう!! –

関連する問題