6

我有3个模型命名:

具有 Pencil.Id(int) 和 Pencil.Colors(IEnumerable) 属性的铅笔

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

具有 ID 和名称的颜色。

铅笔与颜色有关系(多对多) 钢笔与颜色有关系(多对多)

我想建立一个查询,它会显示我拿着的笔的相同颜色的铅笔。

我正在使用以下 LINQ-to-Entities 查询:

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 或 string 等常规变量而不是对象。

我能做些什么?提前感谢您的帮助。

已编辑: 我为下一个可能的问题创建了一个新问题:C# LINQ to Entities- Properties on the intersection of an object and a collection of objects

4

2 回答 2

9
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));
于 2012-07-30T13:04:13.617 回答
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);
        }
    }
}
于 2012-07-30T13:11:39.290 回答