2017-01-09 68 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个语句完成而不是一个。 –