C#LINQ to Entities-对象和对象集合的交集上的属性

时间:2012-08-01 13:37:37

标签: c# entity-framework linq-to-entities

我曾经问过一个类似的问题,目的是要了解如何在另一组中获得与我持有的模型具有相同属性的模型。

现在的问题是: 那么,实际上引导我到另一组的“类似属性”的名称是什么。

原帖是: C# LINQ to Entities query for the intersection of two different properties

我有3个名为的模型:

  1. 铅笔有Pencil.Id(int)和Pencil.Colors(IEnumerable)属性
  2. 具有Pen.Id(int)和Pen.Colors(IEnumerable)属性的笔
  3. 具有Id和名称的颜色。
  4. 颜色模型是IEnumerable,所以它有超过1种颜色。例如;笔有15种不同的颜色,铅笔有25种不同的颜色。如果我所持有的笔的一种颜色在该铅笔的调色板中也是可用的,我想带上相应的铅笔。

    Raphael 的最佳解决方案是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的新手,非常感谢任何帮助。

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分:1)

如果您手中握着多支笔,请使用(在变量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()

答案 2 :(得分: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))
});