2012-07-30 54 views
5

交點我有3個車型命名爲:C#LINQ實體查詢的兩種不同的性質

鉛筆具有Pencil.Id(int)和Pencil.Colors(IEnumerable的)屬性

具有Pen.Id(int)和Pen.Colors(IEnumerable)的筆屬性

顏色具有Id和名稱。

鉛筆與顏色(許多到多) 筆與顏色(許多到多)

我想建立一個查詢,它會顯示我的相同顏色的關係的關係我持有的鋼筆。

我使用下面的LINQ到實體查詢:

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; 

顏色模型的IEnumerable所以它有超過1點的顏色。例如;筆有15種不同的顏色,鉛筆有25種不同的顏色。如果我拿着的筆的其中一種顏色在鉛筆的顏色調色板中也可用,我想要帶上相應的鉛筆。

但我得到一個異常使用常規變量,如int或字符串,而不是對象。

我該怎麼辦?預先感謝您的幫助。

編輯: 我創建了一個新的問題,爲下一個可能的問題:C# LINQ to Entities- Properties on the intersection of an object and a collection of objects

+0

你是不是在複雜呢?回想一下普通的SQL(這就是你的查詢將被轉換爲的東西),你可不可以直接從db.Pencils中的m中說m.Color = p.Color select m? – 2012-07-30 13:01:31

+0

顏色模型是IEnumerable,因此它有不止一種顏色。例如一支筆有15種不同的顏色,一支筆有25種不同的顏色。我想看看鉛筆的顏色中是否有一種顏色也是可用的。 – MrGorki 2012-07-30 13:03:53

+0

如果您的顏色屬性是可枚舉的,那麼可能使用'Colors'或'Palette'來更好地描述它的意圖。 – 2012-07-30 13:18:36

回答

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

它的作品就像一個魅力!謝謝拉斐爾 – MrGorki 2012-07-30 18:28:04

+0

嘿拉斐爾。如何獲得交集的顏色列表?如果您有解決方案,我將不勝感激。 – MrGorki 2012-08-01 13:24:46

+0

我剛剛爲此問題創建了一個新問題:http://stackoverflow.com/questions/11760499/c-sharp-linq-to-entities-properties-on-the-intersection-set – MrGorki 2012-08-01 13:38:23

0

怎麼樣簡化你的代碼,做這種方式,我知道這是不是特別優雅,但我不能確定(把我的頭頂部)LINQ是否有做的很好的方式你想要的東西:

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

謝謝!這是一個好方法,但我不知道它的性能是否足夠好。這似乎符合邏輯,但我更喜歡直接LINQ查詢而不是循環。 – MrGorki 2012-07-30 18:29:31

+0

@MrGorki沒問題,接受的答案是一個好主意,所以我也從中學到了! – 2012-07-31 10:54:04