3

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

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

原帖是: 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 和名称的颜色。

颜色模型是 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 很陌生,非常感谢任何帮助。

4

3 回答 3

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));
于 2012-08-01T13:51:23.590 回答
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()
于 2012-08-01T14:30:09.807 回答
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))
});
于 2012-08-01T14:38:04.790 回答