2012-07-30 29 views
5

tengo 3 modelos denominan:C# LINQ a Entidades consulta para la intersección de dos propiedades diferentes

Lápiz tener Pencil.Id (int) y Pencil.Colors (IEnumerable) Propiedad

Pen teniendo propiedad Pen.Id (int) y Pen.Colors (IEnumerable)

Colores teniendo Id y nombre.

lápiz tiene una relación con colores (muchos-a-muchos) pluma tiene una relación con los colores (muchos-a-muchos)

Quiero construir una consulta que me va a mostrar el mismo color lápices para la pluma que estoy sosteniendo.

estoy usando el siguiente consulta LINQ a Entidades:

int id = id_of_the_pen_that_i_am_holding; 
Pen p = db.Pens.Find(id); 
var list = from m in db.Pencils where m.Colors.Intersect(p.Colors) != null select m; 

Colores modelo es IEnumerable por lo que tiene más de 1 color. Por ejemplo; el bolígrafo tiene 15 colores diferentes y el lápiz tiene 25 colores diferentes. Quiero traer el lápiz correspondiente si uno de los colores del bolígrafo que tengo también está disponible en la paleta de colores de ese lápiz.

Pero estoy obteniendo una excepción para usar variables regulares como int o cadena en lugar de objetos.

¿Qué puedo hacer? Gracias de antemano por sus ayuda.

Editado: He creado una nueva pregunta para un próximo número posible: C# LINQ to Entities- Properties on the intersection of an object and a collection of objects

+0

¿no estás complicando más de esto? Piense en SQL simple (que es a lo que su consulta se convertirá de todos modos) ¿no puede simplemente decir desde m en db.Pencils donde m.Color = p.Color seleccione m? –

+0

El modelo de color es IEnumerable por lo que tiene más de 1 color. Por ejemplo, una pluma tiene 15 colores diferentes y una pluma tiene 25 colores diferentes. Quiero ver si uno de los colores de la pluma también está disponible en la escala de colores del lápiz. – MrGorki

+0

Si su propiedad de color es enumerable, entonces tal vez el nombre 'Colors' o' Palette' describa mejor su intención. –

Respuesta

6
int id = id_of_the_pen_that_i_am_holding; 
Pen p = db.Pens.Find(id); 
var penColorIds = p.Color.Select(m => m.Id).ToList(); 
var list = db.Pencils.Where(pencil => pencil.Color.Any(color => penColorIds.Contains(color.Id)); 
+0

¡Funciona como un amuleto! Gracias Raphael – MrGorki

+0

Hola Raphael. ¿Qué hay de obtener la lista de los colores en el conjunto de intersección? Apreciaré si tienes una solución para esto también. – MrGorki

+0

Acabo de crear una nueva pregunta para este problema: http://stackoverflow.com/questions/11760499/c-sharp-linq-to-entities-properties-on-the-intersection-set – MrGorki

0

¿Qué pasa con la simplificación de su código y hacerlo de esta manera, yo sé que no es particularmente elegante, pero yo no estoy seguro (de la parte superior de mi cabeza) si LINQ tiene un buen forma de hacer lo que quiere:

IList<Pencil> sameColorPencils = new List<Pencil>(); 

Pen p = db.Pens.Find(id); 

foreach (Color color in p.Color) 
{ 
    var pencils = from pencil in db.Pencils 
        where pencil.Color == color 
        select pencil; 

    foreach (Pencil pencil in pencils) 
    { 
     if (sameColorPencils.Count(e => e.Id == pencil.Id) == 0) 
     { 
      sameColorPencils.Add(pencils); 
     } 
    } 
} 
+0

¡Gracias! Es un buen enfoque, pero no sé si su rendimiento es lo suficientemente bueno. Parece lógico, pero prefiero una consulta LINQ directa en lugar de bucles. – MrGorki

+0

@MrGorki no hay problema, la respuesta aceptada fue una gran idea, así que aprendí de eso también! –

Cuestiones relacionadas