2010-05-22 4 views
3

Je veux avoir suivant le type de requête dans le cadre de l'entité travailauto se joindre à Entity Framework

SELECT c2.* 
FROM Category c1 INNER JOIN Category c2 
ON  c1.CategoryID = c2.ParentCategoryID 
WHERE c1.ParentCategoryID is NULL 

Comment faire le travail ci-dessus dans Entity Framework ...

Répondre

9

Eh bien, je ne sais pas beaucoup sur EF, mais qui ressemble à quelque chose comme:

var query = from c1 in db.Category 
      where c1.ParentCategoryId == null 
      join c2 in db.Category on c1.CategoryId equals c2.ParentCategoryId 
      select c2; 
+0

C'est très bien. Je connais celui-là, mais j'ai besoin d'EF. De toute façon Merci ... – Waheed

+3

@Waheed: Je ne sais pas ce que vous voulez dire - vous devriez pouvoir utiliser cette requête exacte dans EF. –

+0

bonjour, je l'ai changé pour retourner la liste catergoyList alors il dit que vous avez besoin de lancer. comment lancer var à la liste objet? –

2

Juste pour ranger ce jusqu'à ce qui suit est un peu plus agréable et fait la même chose:

var query = from c1 in db.Category 
      from c2 in db.Category 
      where c1.ParentCategoryId == null 
      where c1.CategoryId == c2.ParentCategoryId 
      select c2; 
1

Dans EF 4.0+, LEFT JOIN syntaxe est un peu différent et présente une bizarrerie fou:

var query = from c1 in db.Category 
     join c2 in db.Category on c1.CategoryID equals c2.ParentCategoryID 
     into ChildCategory 
     from cc in ChildCategory.DefaultIfEmpty() 
     select new CategoryObject 
     { 
      CategoryID = c1.CategoryID, 
      ChildName = cc.CategoryName 
     } 

Si vous capturez l'exécution de cette requête dans SQL Server Profiler, vous verrez qu'il fait en effet effectuer une jointure gauche. Cependant, si vous avez plusieurs clauses LEFT JOIN ("Group Join") dans votre requête Linq-to-Entity, j'ai trouvé que la clause d'auto-jointure PEUT effectivement s'exécuter comme dans INNER JOIN - MÊME SI LA SYNTAXE CI-DESSUS EST UTILISÉE!

La résolution à cela? Comme je suis fou et, selon MS, faux comme cela semble, j'ai résolu cela en changeant l'ordre des clauses de jointure. Si la clause LEFT JOIN auto-référencée était la première jointure de groupe Linq, SQL Profiler a signalé un INNER JOIN. Si la clause LEFT JOIN auto-référencée était la dernière jointure du groupe Linq, SQL Profiler a signalé un LEFT JOIN.