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

标签 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) 属性的 Pen
  3. 具有 ID 和名称的颜色。

颜色模型是 IEnumerable,所以它有不止一种颜色。例如;钢笔有 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 的新手,非常感谢任何帮助。

最佳答案

您可以使用 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));

关于C# LINQ to Entities-对象和对象集合交集的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11760499/

相关文章:

c# - Directory.EnumerateFiles 与 Directory.GetFiles 之间有什么区别?

c# - 订阅已加载程序集的事件

entity-framework - EF Core 3 GroupBy 多列 Count Throws 与扩展但 linq 有效

entity-framework - 使用 EF Code First 的 SQL Server View 与 LINQ to entity 查询

linq - 从 .NET 客户端使用 ADO.NET 数据服务的服务操作

asp.net-mvc - Entity Framework 6.2 首次启动非常慢并且 EFInteractiveViews

c# - 代码重复的最佳实践 c#

c# - 以编程方式打开上下文菜单时如何引发 ContextMenuOpening 事件

c# - 如何更改View中的显示文本?

c# - 无法创建常量值。只有原始类型