2017-01-09 11 views
0

Oracleでは正しく動作する外部結合が残っていますが、LINQに変換すると機能しません。 LINQを介して実行すると、ユーザーのためにLINQ左外側結合が機能しない(例を含む)

SELECT P.* 
FROM T_PER P 
     INNER JOIN T_PER_CMN_ATRB C ON C.PER_ID = P.PER_ID 
     LEFT OUTER JOIN T_PER_ADDL_ATRB A22 ON A22.PER_CMN_ATRB_ID = C.PER_CMN_ATRB_ID 
WHERE A22.ADDL_ATRB_ID = 22 
     AND (C.PER_LST_NM LIKE 'Chen%' or A22.ADDL_ATRB_VAL like 'Chen%'); 

SQLを返すSQL

T_PER_ADDL_ATRB

に存在しないレコードを検索するので、私は何のレコードを取得していない1のレコード

LINQ

(from P in db.T_PER 
join C in db.T_PER_CMN_ATRB on P.PER_ID equals C.PER_ID 
join A22 in db.T_PER_ADDL_ATRB on C.PER_CMN_ATRB_ID equals A22.PER_CMN_ATRB_ID into A22_join 
from A22 in A22_join.DefaultIfEmpty() 
where 
    A22.ADDL_ATRB_ID == 22 && 
    (C.PER_LST_NM.StartsWith("Chen") || 
    A22.ADDL_ATRB_VAL.StartsWith("Chen")) 
select P).ToList() 

LINQは0レコードを返します

DefaultIfEmpty()
+0

がに特別な何かをしていませんあなたのSQLを変換するには、 'WHERE A22.ADDL_ATRB_ID = 22'は基本的に' LEFT OUTER JOIN'を殺すべきです。参加する前にその条件を追加してみてください。 'A22をdb.T_PER_ADDL_ATRB.Where(A22 => A22.ADDL_ATRB_ID == 22)'に入れ、 'Where'節から削除します。 –

+0

SQLはChenで検索していますが、LinqはKonyayevを使用しています。 – juharr

答えて

0

使用Whereはとても状態がLEFT OUTER JOIN句に追加される

(from P in db.T_PER 
join C in db.T_PER_CMN_ATRB on P.PER_ID equals C.PER_ID 
join A22 in db.T_PER_ADDL_ATRB on C.PER_CMN_ATRB_ID equals A22.PER_CMN_ATRB_ID into A22_join 
from A22 in A22_join.Where(x => x.ADDL_ATRB_ID == 22).DefaultIfEmpty() 
where 
    (C.PER_LST_NM.StartsWith("Konyayev") || 
    (A22 == null || (A22 != null && A22.ADDL_ATRB_VAL.StartsWith("Konyayev")) 
    ) 
) 
select P).ToList() 
+0

これは試しても動作しません:-( –

1
public static IEnumerable<TResult> LeftJoin<TSource, TInner, TKey, TResult>(this IEnumerable<TSource> source,             IEnumerable<TInner> inner, Func<TSource, TKey> pk, Func<TInner, TKey> fk, Func<TSource, TInner, TResult> result) 
    { 
     IEnumerable<TResult> _result = Enumerable.Empty<TResult>(); 

     _result = from s in source 
        join i in inner 
        on pk(s) equals fk(i) into joinData 
        from left in joinData.DefaultIfEmpty() 
        select result(s, left); 

     return _result; 
    } 
-1

あなたは以下のようなものでした:できるだけ早くOracleなど

from p in db.TPER 
join c in db.T_PER_CMN_ATRB on p.PER_ID equals c.PER_ID 
join a22 in db.T_PER_ADDL_ATRB.Where(p=> p.ADDL_ATRB_ID == 22) on c.PER_ID equals a22.PER_CMN_ATRB_ID into a22_join 
from a22table in a22_join.DefaultIfEmpty() 
select new { 
a22table.ADDL_ATRB_ID, 
C.PER_LST_NM, 
A22.ADDL_ATRB_VAL 
P, 
}).Where(p=> p.PER_LST_NM.StartsWith("Chen") || p.ADDL_ATRB_VAL.StartsWith("Chen")).ToList() 
+0

これは動作しますが、パフォーマンスはひどいです。2つのステートメントが1つではなく実行されるため、私は推測しています。 –

関連する問題