簡體   English   中英

LINQ左外部聯接不起作用(帶有示例)

[英]LINQ Left Outer Join not working (with example)

我離開了外部聯接,該聯接在Oracle中正常工作,但是在轉換為LINQ時無法工作。 通過LINQ執行時,我沒有任何記錄,因為對於用戶搜索,該記錄在T_PER_ADDL_ATRB中不存在

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條記錄

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;
    }  

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()

您可以執行以下操作:

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM