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

3
我曾经也提出过一个类似的问题,旨在了解如何获得另一个集合中具有与我持有的集合相同属性的模型。
现在的问题是: 那么,“相似属性”的名称是什么,它实际上指导我到达另一个集合。
原始帖子是: C# LINQ to Entities query for the intersection of two different properties
我有3个模型的名称为: 1. 铅笔(Pencil)有铅笔ID(int)和颜色(IEnumerable)属性 2. 钢笔(Pen)有Pen.ID(int)和颜色(IEnumerable)属性 3. 颜色(Colors)具有ID和名称。
颜色模型是一个IEnumerable,因此它具有多种颜色。例如;钢笔有15种不同的颜色,而铅笔有25种不同的颜色。如果我持有的笔中有一种颜色也在那支铅笔的调色板中,则我想带来相应的铅笔。 的好方法是https://dev59.com/7mbWa4cB1Zd3GeqPZbGI#11722191。
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个回答

2
你可以在使用 SelectMany 扩展后缩小的颜色上使用 Intersect 扩展。
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 p = db.Pens.Find(id); 
var commonColors = Pen.Colors
    .Insersect(db.Pencils.SelcectMany(p => p.Colors));

很好,但我正在寻找我所持的笔与其余铅笔的公共颜色交集。因此,笔只是一个对象,而铅笔则是一个集合。这种情况下这个方法可行吗? - Görkem Öğüt
var commonColors = db.Pencils.SelectMany(p => p.Colors).Distinct().Intersect(Pen.Colors).Distinct()); 没有起作用 :( - Görkem Öğüt

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()

它提供了一个非常必要的解决方案,可以组合回答两个问题。但你是对的,第一个答案是你的,并且回答了所有问题的要求。再次感谢你。 - Görkem Öğüt

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

尊重 Raphael。真的很棒。你又做到了。我认为这是组合2的最佳解决方案,但 Bob 的答案也有效,而且他是第一个回答的。希望你能理解。 - Görkem Öğüt
@MrGorki 没问题,这是正确的做法,没有什么需要理解的 ;) - Raphaël Althaus

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