2010-01-28 5 views
3

LINQ to EF를 사용하여 다음 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가 null 인 다른 레코드는 제외하고 지정된 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'형식의 요소를 비교할 수 없습니다. 이것은 (EF가 불평하고있는) (role.QueueAccess == null)과 관련이 있습니다. 이 문제를 해결할 방법이 있습니까? 감사합니다. – Joe

+0

아, 알겠습니다. 나는 그것을 고쳐 줄 것이다. –

0

이와 비슷한 방식으로 WHERE 절과 반대되는 조건을 ON으로 설정하십시오.

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)