2012-07-30 8 views
5

Ho 3 modelli denominati:C# query LINQ to Entities per l'intersezione di due diverse proprietà

matita avendo Pencil.Id (int) e Pencil.Colors (IEnumerable) Proprietà

Penna con proprietà Pen.Id (int) e Pen.Colors (IEnumerable)

Colori aventi ID e nome.

Matita ha una relazione con i colori (molti-a-molti) Pen ha una relazione con i colori (molti-a-molti)

voglio costruire una query che mi mostrerà lo stesso colore matite per la penna che sto tenendo.

Sto usando il seguito di query LINQ to Entities:

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; 

Colori modello è IEnumerable quindi ha più di 1 colore. Per esempio; la penna ha 15 diversi colori e la matita ha 25 diversi colori. Voglio portare la matita corresonding se uno dei colori della penna che sto tenendo è anche disponibile nella tavolozza dei colori di quella matita.

Ma sto ottenendo un'eccezione per utilizzare variabili regolari come int o stringa piuttosto che oggetti.

Cosa posso fare? Grazie in anticipo per i tuoi aiuti.

Modificato: Ho creato una nuova domanda per un prossimo numero possibile: C# LINQ to Entities- Properties on the intersection of an object and a collection of objects

+0

non sei più di complicare questo? Ripensa a SQL semplice (che è quello che verrà convertito in ogni caso) non puoi invece dire semplicemente da m in db.Pencils dove m.Color = p.Color seleziona m? –

+0

Il modello di colore è IEnumerable quindi ha più di 1 colore. Ad esempio, una penna ha 15 colori diversi e una penna ha 25 colori diversi. Voglio vedere se uno dei colori della penna è disponibile anche nella scala dei colori della matita. – MrGorki

+0

Se la proprietà del colore è enumerabile, forse il nome 'Colori' o 'Tavolozza' descriverà meglio l'intento. –

risposta

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

Funziona come un fascino! Grazie Raffaele – MrGorki

+0

Ehi, Raffaele. Che ne dici di ottenere l'elenco dei colori nel set di intersezioni? Apprezzerò se hai una soluzione anche per questo. – MrGorki

+0

Ho appena creato una nuova domanda per questo problema: http://stackoverflow.com/questions/11760499/c-sharp-linq-to-entities-properties-on-the-intersection-set – MrGorki

0

Che dire semplificando il codice e facendo in questo modo, io so che non è particolarmente elegante, ma io' non sono sicuro (la parte superiore della mia testa) se LINQ ha una bella modo di fare ciò che si vuole:

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

Grazie! È un buon approccio, ma non so se le sue prestazioni siano abbastanza buone. Sembra logico, ma preferisco una query LINQ diretta piuttosto che un loop. – MrGorki

+0

@MrGorki nessun problema, la risposta accettata è stata una grande idea così ho imparato anche da quello! –

Problemi correlati