2010-01-28 13 views
3

J'essaie de répliquer le code SQL suivant en utilisant LINQ to EF mais sans succès.Liaison LINQ à EF à gauche avec des conditions multiples

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

Voici ce que j'ai essayé.

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(); 

Vous avez également essayé.

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

Je continue à obtenir que le dossier avec le queueId spécifié, mais aucun des autres dossiers où la queueId est nulle.

Merci pour votre aide.

Répondre

2

Essayez quelque chose comme ceci:

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() n'est pas pris en charge dans EF à partir de ce que j'ai essayé. Seriez-vous en mesure d'offrir un travail autour? Merci – Joe

+0

'DefaultIfEmpty' est pris en charge dans EF 4 mais pas dans EF 1. –

+0

@Joe: Avez-vous une collection comme Role.QueueAccesses dans votre modèle? –

4

It's nearly always a mistake to use join in LINQ to Entities. Au lieu de cela, faites:

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

J'ai essayé et j'ai eu une exception. System.NotSupportedException: Impossible de comparer les éléments de type 'System.Data.Objects.DataClasses.EntityCollection'1'. Seuls les types primitifs (tels que Int32, String et Guid) et les types d'entité sont pris en charge. Ceci est en relation avec (role.QueueAccess == null) dont EF se plaint. Y a-t-il un moyen de contourner ceci? Merci – Joe

+0

Oh, je vois - c'est un à plusieurs. Je vais arranger ça. –

0

Quelque chose comme cela fonctionne aussi, met la condition dans le ON en opposition à la clause 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)