2012-08-01 23 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