2010-01-28 4 views
3

Я пытаюсь реплицировать следующий SQL, используя LINQ to EF, но не повезло.LINQ to EF left join with multiple condition

select * from Role 
left join QueueAccess on Role.RoleId = QueueAccess.RoleId and queueId = 361 

Вот что я пробовал.

var myAccess = (from role in entity.Role.Include(p => p.QueueAccess) 
join qa in entity.QueueAccess 
on new { rID = role.RoleId, qID = queueId } equals new { rID = qa.RoleId, qID = qa.QueueId } 
select role).ToList(); 

Также попробовал это.

var myAccess = entity.Role.Include(p => p.QueueAccess) 
     .Where(x => x.QueueAccess.Any(a => a.QueueId == queueId)).ToList(); 

Я продолжаю получать только запись с указанным queueId, но ни один из других записей, где queueId является нулевым.

Благодарим за помощь.

ответ

2

попробовать что-то вроде этого:

var access = from role in Role 
      join oq in (from q in QueueAccess 
         where q.queueId = 361 
         select q) on role.RoleId equals queue.RoleId into oqs 
      from queue in oqs.DefaultIfEmpty() 
      select new { role.RoleId, queue.Property }; 
+0

DefaultIfEmpty() не поддерживается в EF из того, что я пробовал. Могли бы вы предложить работу? Спасибо – Joe

+0

'DefaultIfEmpty' поддерживается в EF 4, но не в EF 1. –

+0

@Joe: У вас есть коллекция, например Role.QueueAccesses в вашей модели? –

4

It's nearly always a mistake to use join in LINQ to Entities. Вместо этого выполните:

var myAccess = (((ObjectQuery)from role in entity.Role 
           where role.QueueAccess.Any(a => a.QueueId == queueId) 
           select role).Include("QueueAccess")).ToList(); 
+0

Я дал это и получил исключение. System.NotSupportedException: Невозможно сравнить элементы типа «System.Data.Objects.DataClasses.EntityCollection'1». Поддерживаются только примитивные типы (такие как Int32, String и Guid) и типы сущностей Это связано с (role.QueueAccess == null), с которым жалуется EF. Есть ли способ обойти это? Спасибо – Joe

+0

О, я вижу - это одно для многих. Я исправлю это. –

0

Что-то вроде этого тоже работает, помещает условие в ON как противопоставление предложению WHERE.

join tbl3 in model.phone.Where(p => p.queue == 0 && p.phnkey == key) on x.key equals tbl3.y into a3 
          from phn in a3.DefaultIfEmpty() 
          where (phn.abc == 0)