2012-07-30 14 views
5

mam 3 modele o nazwie:C# LINQ podmiotom zapytania na przecięciu dwóch różnych właściwościach

Pencil mający Pencil.Id (int) i Pencil.Colors (IEnumerable) Property

Pen o Pen.Id (int) i Pen.Colors (IEnumerable) Właściwość

Kolory o identyfikatorze i nazwisku.

Pencil ma związek z kolorów (many-to-many) Pen ma związek z kolorami (wiele do wielu)

Chcę zbudować kwerendę, która pokaże mi tego samego koloru ołówki za pióro, które trzymam.

Używam poniżej kwerendy LINQ-podmioty:

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; 

Kolory model jest IEnumerable więc ma więcej niż 1 kolor. Na przykład; pióro ma 15 różnych kolorów, a ołówek ma 25 różnych kolorów. Chcę przynieść koreański ołówek, jeśli jeden z kolorów długopisu, który trzymam, jest również dostępny w palecie kolorów tego ołówka.

Ale otrzymuję wyjątek, aby używać zmiennych regularnych, takich jak int lub string, a nie obiektów.

Co mogę zrobić? Z góry dziękuję za pomoc.

edycja: Utworzyłem nowe pytanie do następnej ewentualnej emisji: C# LINQ to Entities- Properties on the intersection of an object and a collection of objects

+0

czy nie ponad komplikuje to? Pomyśl o zwykłym SQL (do czego twoja kwerenda zostanie przekonwertowana), nie możesz zamiast tego po prostu powiedzieć z m w db.Pencils gdzie m.Color = p.Color wybierz m? –

+0

Model kolorów jest IEnumerable, więc ma więcej niż 1 kolor. Na przykład pióro ma 15 różnych kolorów, a pióro ma 25 różnych kolorów. Chcę sprawdzić, czy jeden z kolorów pióra jest dostępny w skali kolorów ołówka. – MrGorki

+0

Jeśli twoja własność koloru jest przeliczalna, to może nazwa "Kolory" lub "Paleta" lepiej opisa jej intencję. –

Odpowiedz

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

Działa jak urok! Dzięki Raphael – MrGorki

+0

Hej Raphael. A może ustawić listę kolorów w zestawie skrzyżowań? Będę wdzięczny, jeśli masz rozwiązanie tego również. – MrGorki

+0

Właśnie utworzyłem nowe pytanie dotyczące tego problemu: http://stackoverflow.com/questions/11760499/c-sharp-linq-to-entities-properties-on-the-sesection-set – MrGorki

0

Co o uproszczenie kodu i robi to w ten sposób, wiem, że to nie jest szczególnie elegancki, ale I” m not sure (poza czubek głowy) czy LINQ ma piękny sposób robić co chcesz:

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

Dzięki! Jest to dobre podejście, ale nie wiem, czy jego wydajność jest wystarczająco dobra. Wydaje się to logiczne, ale wolę bezpośrednie zapytanie LINQ niż pętle. – MrGorki

+0

@MrGorki bez problemu, zaakceptowana odpowiedź była świetnym pomysłem, więc też się z tego nauczyłem! –

Powiązane problemy