2010-10-26 9 views
6

J'ai donc un objet Blog qui a une liste d'objets tag (List<Tag>).Comment faire WHERE IN dans linq

J'essaie de créer une méthode qui prend une liste de balises et retourne une liste de blogs qui contiennent toutes les balises dans la liste passée.

J'ai été capable de faire une méthode qui retournera une liste de blogs si elle correspond à une balise, mais pas une liste de balises.

faire que j'ai cette

entities.Blogs.Where(b => b.Tags.Any(t => t.Name == tagName)) 

Mais je ne peux pas comprendre comment faire quelque chose comme ça

entities.Blogs.Where(b => b.Tags.Any(t => t.Name == tags[0] AND t.Name == tags[1] AND t.Name == tags[2] etc.......)) 

Est-il possible de le faire?

Merci!

J'utilise LINQ to Entities

+0

Voulez-vous dire que vous recherchez des blogs qui contiennent au moins un tag du tableau de tags? Ou essayez-vous de trouver des blogs qui contiennent tous les tags du tableau des tags? – MerickOWA

+0

Je pense que ça va faire en sorte qu'il ne retourne que quelque chose qui a un tag qui correspond à tout dans votre liste passée. – BlackICE

+0

J'essaie de trouver des blogs qui contiennent tous les tags du tableau des tags – hanesjw

Répondre

11

Logiquement, je pense que vous voulez quelque chose comme:

entities.Blogs.Where(b => tags.All(t => b.Tags.Any(bt => bt.Name == t))) 

Autre possibilité:

HashSet<string> tagNames = new HashSet<string>(tags); 
return entities.Blogs 
       .Where(b => tagNames.IsSubsetOf(b.Tags.Select(x => x.Name))); 

Si cela utilise LINQ to Entities, je doute que cela fonctionnera - mais cela devrait fonctionner si vous utilisez simplement LINQ to Objects. Même alors, ça ne va pas être terriblement efficace. Je soupçonne qu'il y a une façon plus efficace de faire les choses, mais je ne peux pas y penser immédiatement ... on a l'impression que l'on veut faire une jointure, mais ensuite ça devient compliqué.

+0

Jon Skeet est le MAN! Merci JS. La première option a bien fonctionné. – hanesjw

1

Vous pouvez faire quelque chose comme ceci:

List<Tag> tags = GetTags...; 
IQueryable<Blog> blogs = entities.Blogs; // start with all 
foreach(var tag in tags){ 
    var thisTag = tag; //this is needed to prevent a bug 
    blogs = blogs.Where(entry=>entry.Tags.Any(entryTag=>entryTag.TagId==thisTag.TagId)); 
} 
return blogs.OrderBy....; 

Cette volonté chaîner les clauses Si d'exiger que tous les mots clés soient présents pour une entrée de blog à retourner.