LINQ to EF левое соединение с несколькими условиями - PullRequest
3 голосов
/ 29 января 2010

Я пытаюсь реплицировать следующий SQL-запрос, используя LINQ to EF, но безуспешно.

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 равен нулю.

Спасибо за вашу помощь.

Ответы [ 3 ]

4 голосов
/ 29 января 2010

Почти всегда ошибочно использовать join в LINQ to Entities . Вместо этого выполните:

var myAccess = (((ObjectQuery)from role in entity.Role
                              where role.QueueAccess.Any(a => a.QueueId == queueId)
                              select role).Include("QueueAccess")).ToList();
2 голосов
/ 29 января 2010

Попробуйте что-то вроде этого:

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 голосов
/ 12 ноября 2011

Нечто подобное тоже работает, ставит условие в 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 )
...