C# LINQ to Entities查询两个不同属性的交集

6

我有3个模型,它们分别是:

Pencil,具有 Pencil.Id(int) 和 Pencil.Colors(IEnumerable) 属性。

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

Colors,具有 Id 和 name 属性。

Pencil 与颜色相关(多对多关系), Pen 与颜色相关(多对多关系)。

我想构建一个查询,它将显示与我手中的笔具有相同颜色的铅笔。

我正在使用以下 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类型,因此它有多种颜色。例如,钢笔有15种不同的颜色,而铅笔则有25种不同的颜色。如果我手中的钢笔中有一种颜色也在铅笔的颜色调色板中存在,我想得到对应的铅笔。
但是我却遇到了一个异常,提示我使用普通变量,如int或string,而不是对象。
我该怎么办?感谢您的帮助。
编辑过:我已经为可能出现的下一个问题创建了一个新的问题:C# LINQ to Entities- Properties on the intersection of an object and a collection of objects

你是不是过于复杂化了这个问题?回想一下普通的SQL(无论如何,你的查询最终都会被转换为它),难道你不能只是简单地说“从db.Pencils中选择m,其中m.Color = p.Color”吗? - Paul Aldred-Bann
颜色模型是IEnumerable,因此它具有多个颜色。例如,一支笔有15种不同的颜色,而另一支笔有25种不同的颜色。我想查看铅笔的颜色刻度中是否也有笔的某种颜色可用。 - Görkem Öğüt
如果您的颜色属性是可枚举的,那么也许将其命名为“Colors”或“Palette”会更好地描述它的意图。 - Sergey Berezovskiy
你尝试过让Color实现IEquatable<Color>吗?请参见https://dev59.com/FWgu5IYBdhLWcg3wfHI_ - Matt Mills
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));

嘿,拉斐尔。能否获取交集中颜色列表?如果你有解决方案,我会非常感激。 - Görkem Öğüt
我刚刚为这个问题创建了一个新的问题链接:https://dev59.com/lWbWa4cB1Zd3GeqPacls - Görkem Öğüt

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

谢谢!这是一个不错的方法,但我不知道它的性能是否足够好。虽然它看起来很合理,但我更喜欢直接使用LINQ查询而不是循环。 - Görkem Öğüt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接