2017-01-09 40 views
0

我已經離開了外部聯接,它在Oracle中正常工作,但在轉換爲LINQ時無法工作。當通過LINQ執行我沒有得到任何記錄,因爲用戶搜索記錄中T_PER_ADDL_ATRBLINQ左外部聯接不工作(使用示例)

SQL

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返回不存在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條記錄

+0

只要甲骨文沒有做一些特別的東西轉換你的SQL,WHERE A22.ADDL_ATRB_ID = 22'基本上應該殺死'LEFT OUTER JOIN'。嘗試在連接之前添加該條件,例如'在db.T_PER_ADDL_ATRB.Where(A22 => A22.ADDL_ATRB_ID == 22)中加入A22'並將其從'Where'子句中移除。 –

+0

您的SQL正在搜索Chen,但您的Linq正在使用Konyayev。 – juharr

回答

0

使用WhereDefaultIfEmpty()這樣的情況會在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

你可以類似下面的東西:

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個語句完成而不是一個。 –