2010-01-28 137 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)