2014-09-30 2 views
0

мне нужно написать следующий T-SQL в LINQ:LEFT JOIN с ИЛИ условие LINQ

SELECT T1.ID, T2.Name 
FROM T1 
LEFT JOIN T2 ON (T1.ID = I2.ID1 OR T1.ID = T2.ID2) 

ОШ присоединиться бы выглядеть в LINQ:

T1.Join(T2, t1=>new{}, t2=>new{}, (t1,t2)=>new{ID=t1.Id, t2=t2}).Where(o=>o.Id == o.t2.Id1 || o.Id==o.t2.Id2); 

Но запрос INNER JOIN, а не LEFT JOIN. Какой-LEFT JOIN будет выглядеть следующим образом:

T1.GroupJoin(T2, t1 => t1.Id, t2 => t2.Id1, (t1, t2) => new { Id = t1.Id, Name1 = t2.Select(t => t.Name) }).DefaultIfEmpty() 
    .GroupJoin(T2, o => o.Id, t2 => t2.Id2, (i, j) => new { Id = i.Id, Name1 = i.Name1, Name2 = j.Select(t => t.Name) }).DefaultIfEmpty(); 

Этот запрос выдает правильные результаты, но делает 2 присоединяется вместо 1. Или это действительно эквивалентно оригинальной T-SQL?

Кто-нибудь знает, как лучше переписать этот запрос?

+0

Почему у вас есть два GroupJoins? –

ответ

3

Этот ответ от подобного вопроса дает нам простой способ, чтобы написать LEFT JOIN S: https://stackoverflow.com/a/4739738/1869660

var query = from t1 in T1 
      from t2 in T2.Where(tt2 => (t1.ID == tt2.ID1) || (t1.ID = tt2.ID2)) 
         .DefaultIfEmpty() 
      select new { t1.ID, t2.Name } 
-2
var LeftJoin = from emp in ListOfEmployees 
       join dept in ListOfDepartment 
       on emp.DeptID equals dept.ID into JoinedEmpDept 
       from dept in JoinedEmpDept.DefaultIfEmpty() 
       select new       
       { 
        EmployeeName = emp.Name, 
        DepartmentName = dept != null ? dept.Name : null       
       }; 
-1

Чтобы решить эту проблему с одним LINQ, попробуйте использовать перекрестное соединение

var results = (from a in test1 
from b in test2 
where a.ID == b.ID1 || a.ID == b.ID2 
select new {x = a.ID, y = b.Name}); 
+0

Это приведет к ВСТУПЛЕНИЮ, а не ВЛЕВОЙ ВСТУПЛЕНИЕ. –