2011-10-25 8 views
11

esto parece que sería bastante fácilLINQ cómo seleccionar un padre con una colección infantil que contiene uno o varios de un array (o lista) de los valores

var orx = gg.Where(x=>x.ProductAttributes.Any (pa =>pa.AttributeId == "home")); 

vuelve gg cuando los atributos del producto tiene un valor de "casa"

lo necesito para volver dónde y gg ha atribuir valores producto de una matriz es decir

var orx = gg.Where(x=>x.ProductAttributes.Any (pa =>pa.AttributeId in "home,work")); 
+0

posible duplicado de [LINQ a Entidades - SQL "IN" cláusula] (http://stackoverflow.com/questions/857973/linq-to-entities-sql-in-clause) – jrummell

Respuesta

21

qué pasa ...

string[] values = new string[] { "home", "work" }; 
var orx = gg.Where(x => x.ProductAttributes.Any(pa => values.Contains(pa.AttributeId)); 

o incluso "home,work".Contains(pa.AttributeId) debería funcionar, si su lista es tan confiable como su ejemplo. (I por ningún medio recomiendo esto a menos que se puede asegurar que AttributeId no será una subcadena de cualquiera de las palabras de la lista .. tales como "yo")

+0

' "casa, el trabajo" .Contains (pa.AttributeId)' se devuelve un resultado incorrecto si alguno de AttributeIds formará parte de las palabras 'home' o' work', por ejemplo 'ork' ... – sll

+0

@sll: Sí, por eso dije" si tu lista es tan confiable como tu ejemplo " – musefan

+1

Esa era la sintaxis que me faltaba, estaba al revés – jason

4

Usando Enumerable.Contains():

var orx = gg.Where(x => x.ProductAttributes 
         .Any(pa => 
          array.Containspa(pa.AttributeId)); 

var orx = gg.Where(x => x.ProductAttributes 
         .Any(pa => 
          "home, work".Split(',').Contains(pa.AttributeId)); 
Cuestiones relacionadas