2010-01-28 120 views
3

我想复制以下SQL使用LINQ到EF但没有运气。LINQ到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为空。

感谢您的帮助。

回答

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

从我尝试过的EF中不支持DefaultIfEmpty()。你能够提供解决方法吗?谢谢 – Joe 2010-01-29 17:20:24

+0

EFI 4支持'DefaultIfEmpty',但不支持EF 1. – 2010-01-29 21:37:59

+0

@Joe:您的模型中是否有类似Role.QueueAccesses的集合? – 2010-01-29 22:06:49

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)和实体类型 这与EF抱怨的(role.QueueAccess == null)有关。有没有解决的办法?谢谢 – Joe 2010-01-29 17:18:39

+0

哦,我明白了 - 这是一对一的。我会解决这个问题。 – 2010-01-29 21:33:54

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)