2009-10-30 5 views
0

Disons que j'ai le schéma suivantRequête LinqToSql qui couvre une relation many-to-many?

Content(Id, ....) 
TagContent(TagId, ContentId) 
Tag(TagId, Name) 

Supposons que je voudrais sélectionner tous les enregistrements de contenu qui ont étiquette avec le nom « test ».

Dans SQL Je voudrais écrire:

select Content.Id 
from Content 
     join TagContent as TC on (TC.ContentId = Content.Id) 
     Join Tag on (TC.TagId = Tag.Id) 
where Tag.Name = 'Test' 

Pourriez-vous suggérer comment écrire une requête similaire dans Linq si vous avez seulement le tableau disponible? (Je voudrais créer une méthode d'extension Content.ByTag (« tag ») -> IQueryable)

Je n'ai réussi à créer une requête qui utilise l'instruction SQL exists au lieu de join. Cela signifie que les requêtes sont extrêmement inefficaces.

Ma solution inefficace actuelle se présente comme suit:

DataContext.Contents.Where(c => c.TagContents.Any(tc => tc.Tag.Name == "Test")) 

REMARQUE: Comme je voudrais faire la méthode d'extension sur DataContext.Contents je ne vais pas avoir accès à d'autres tables qui est DataContext .Tag et DataContext.ContentTag.

Répondre

0

Quelque chose comme ça peut-être

var contentIds = from c in Content 
        join tc in TagContent on c.Id equals tc.ContentId 
        join t in Tag on tc.TagId equals t.Id 
        where t.Name == "Test" 
        select new 
        { 
         ContentId = c.Id 
        }; 
+0

Dans mon extension menthod Je n'ai pas accès à TagContents et Tag –

+0

ahh je vois où votre problème. –

Questions connexes