2012-08-01 20 views
3

的集合實體 - 屬性我常常問這是旨在瞭解如何讓在另一組,其正與一個相同的屬性模型類似的問題我抱着。C#LINQ到對象的交集和對象

現在的問題是: 那麼,究竟是什麼這實際上引導我到另一組「類似的財產」的名稱。

原來的職位是: C# LINQ to Entities query for the intersection of two different properties

我有3種型號命名爲:

  1. 有Pencil.Id(int)和Pencil.Colors(IEnumerable的)房產
  2. 筆有鋼筆鉛筆。 Id(int)和Pen.Colors(IEnumerable)屬性
  3. 具有Id和名稱的顏色。

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

拉斐爾的偉大的解決方案是https://stackoverflow.com/a/11722191/1062284

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)); 

因此,它是確定,就像一個魅力的工作,但對學習的常見顏色的名稱如何? 我們得到其他屬性是持有相同的顏色,但那是什麼顏色?

,我將不勝感激,如果有人能產生這種LINQ查詢。對於LINQ我很新,非常感謝任何幫助。

回答

1

如果您AR Ë持有多個筆在手上,然後使用(可變pens

var colors = pens.SelectMany(p=>p.Colors).Distinct(); 
var commonColors = db.Pencils.SelectMany (p => p.Colors.Where(c=>colors.Contains(c))).Distinct() 

不然,如果你只有一個筆(可變pen

var colors = pen.Colors; 
var commonColors = db.Pencils.SelectMany (p => p.Colors.Where(c=>colors.Contains(c))).Distinct() 
+0

它的工作!非常感謝。 – MrGorki 2012-08-01 14:47:59

+0

@MrGorki那麼,爲什麼你接受了不同的答案? – 2012-08-01 14:50:49

+0

它提供了一個解決方案,結合2個問題和非常需要。但你是對的,第一個回答是你的並回答了問題的所有要求,再次謝謝 – MrGorki 2012-08-01 15:20:30

2

您可以使用Intersect擴展上與SelectMany延伸降低了顏色。

var commonColors = 
    db.Pens.SelectMany(p => p.Colors) 
     .Insersect(db.Pencils.SelectMany(hb => hb.Colors)); 

由於Intersct可能返回一個序列,而不是一組,(我沒有檢查),你可以刪除這樣

var commonColors = 
    db.Pens.SelectMany(p => p.Colors).Distinct() 
     .Insersect(db.Pencils.SelcectMany(hb => hb.Colors).Distinct()); 

重複只是一個Pen

Pen p = db.Pens.Find(id); 
var commonColors = Pen.Colors 
    .Insersect(db.Pencils.SelcectMany(p => p.Colors)); 
+0

偉大的,但我正在尋找筆(我持有)常見的顏色和鉛筆的其餘部分的交集。所以,筆只是一個物體,鉛筆是一個集合。這是否也適用於這種情況? – MrGorki 2012-08-01 14:08:07

+0

var commonColors = db.Pencils.SelectMany(p => p.Colors).Distinct()。Insersect(Pen.Colors).Distinct());沒有工作:( – MrGorki 2012-08-01 14:19:58

1

好了,不知道它使真正意義上得到所有這一切都在一個查詢中,但是,通過這個,你應該得到一個鉛筆的匿名對象列表和每個鉛筆的常用顏色列表(未經測試)。

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)) 
.Select(l => new { 
    pencil = l, 
    colors = l.Color.Where(c => penColorIds.Contains(c.Id)) 
}); 
+0

RESPECT拉斐爾,這真的很棒,你也是這樣做的,我認爲這是結合2的最佳解決方案,但鮑勃的答案也有效,他是第一個回答,我希望你能理解。 – MrGorki 2012-08-01 15:17:36

+0

@MrGorki沒有概率,這是正確的做法,沒有任何理解;) – 2012-08-01 17:51:27