2010-10-26 15 views
6

Así que tengo un objeto de blog que tiene una lista de objetos de etiqueta (List<Tag>).Cómo hacer DONDE EN en linq

Estoy tratando de crear un método que tome una lista de etiquetas y devuelva una lista de blogs que contienen todas las etiquetas en la lista pasada.

Pude hacer un método que devolverá una lista de blogs si coincide con una etiqueta, pero no con una lista de etiquetas.

para hacer eso tengo este

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

Pero no puedo encontrar la manera de hacer algo como esto

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

¿Hay alguna manera de hacer esto?

¡Gracias!

estoy usando LINQ a Entidades

+0

¿Quiere decir que está buscando blogs que contengan al menos una etiqueta del conjunto de etiquetas? ¿O está tratando de encontrar blogs que contengan todas las etiquetas del conjunto de etiquetas? – MerickOWA

+0

Creo que eso lo hará para que solo devuelva algo que tenga una etiqueta que coincida con todo en su lista aprobada. – BlackICE

+0

Estoy tratando de encontrar blogs que contengan todas las etiquetas del conjunto de etiquetas – hanesjw

Respuesta

11

Lógicamente, pienso que usted quiere algo como:

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

alternativa:

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

Si esto es usar LINQ a Entidades, dudo que esto funcionará, pero debería funcionar si solo estás utilizando LINQ to Objects. Incluso entonces, no va a ser terriblemente eficiente. Sospecho que hay una manera más eficiente de hacer las cosas, pero no puedo pensarlo de inmediato ... parece que quieres unirte, pero luego vuelve a ser complicado.

+0

¡Jon Skeet es el HOMBRE! Gracias JS. La primera opción funcionó genial. – hanesjw

1

se puede hacer algo como esto:

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....; 

Esta cadena voluntad del conjunto de cláusulas WHERE para exigir que todas las etiquetas estén presentes para que se devuelva una entrada de blog.