I have left outer join that works correctly in Oracle, but fails to work when converted into LINQ. When executed through LINQ I get no records since for the user searched the record does not exist in 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 returns 1 record
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 returns 0 records
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;
}
Use Where
with DefaultIfEmpty()
so the condition would be added in LEFT OUTER JOIN
clause
(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()
You could something similar to the below:
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()
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.