2011-01-14 3 views
0

J'ai une requête qui fonctionne parfaitement en SQL, mais j'ai le plus de mal à le convertir en linq. La table (Table1 ci-dessous) contient des changements d'état pour plusieurs types d'enregistrements. La jointure nécessite la définition de deux champs pour créer la jointure valide: A SubmissionId (pk de la table à laquelle appartient l'état) et SubmissionTypeId (détermine à quelle table appartient l'état).Convertir SQL Query en Linq (contient des jointures à gauche)

CREATE TABLE ##Table1 (Id int, Status varchar(50), SubmissionId int, SubmissionTypeId int) 
insert into ##Table1(Id, Status, SubmissionId, SubmissionTypeId) 
select 1 ,'Status1' ,1 , 1  
union select 2,'Status2',1, 2 

CREATE TABLE ##Table2 (ID int, Value varchar(50)) 
insert into ##Table2 (ID, Value) 
select 1, 'Value1Table2' 

CREATE TABLE ##Table3 (ID int, Value varchar(50)) 
insert into ##Table3 (ID, Value) 
select 1, 'Value1Table3' 

select ds.* from ##Table1 ds 
left join ##Table2 di 
on ds.SubmissionId = di.Id and ds.SubmissionTypeId = 2 
left join ##Table2 dr 
on ds.SubmissionId = dr.Id and ds.SubmissionTypeId = 1 
where SubmissionTypeId in (1,2) 

J'ai essayé quelques itérations en utilisant l'en x de y dans x.DefaultIfEmpty() et je ne peux pas définir la clause where dans le bon emplacement. J'ai besoin de démarrer la requête avec Table1 car c'est de là que viennent les valeurs. Pour contourner le problème, je divise la requête en deux parties et je viens d'ajouter séquentiellement les données d'état à une liste, mais il semble qu'il y ait une meilleure solution.

Merci.

Répondre

1

Je pense une traduction directe de votre SQL ressemblerait à ceci:

var q = from ds in table1 
     where ds.SubmissionTypeId == 1 || ds.SubmissionTypeId == 2 
     from di in table2 
     from dr in table2 
     where (ds.SubmissionTypeId == 2 && ds.SubmissionId == di.Id) 
      || (ds.SubmissionTypeId == 1 && ds.SubmissionId == dr.Id) 
     select ds; 

Cependant, il semble peu probable que ce soit ce que vous voulez. Si je peux spéculer sur ce que votre logique prévue est, je pense que vous voulez quelque chose de plus comme ceci:

var q = from ds in table1 
     where (ds.SubmissionTypeId == 2 && table2.Any(di => ds.SubmissionId == di.Id)) 
      || (ds.SubmissionTypeId == 1 && table3.Any(dr => ds.SubmissionId == dr.Id)) 
     select ds; 
+0

Merci. Je n'ai pas essayé d'utiliser la fonction .Any dans la clause where. Je vais donner un coup de feu. – Noel

+0

A travaillé comme un charme. – Noel

Questions connexes