c# - 如何使用 LINQ 根据子项和比较器之间的交叉值过滤和操作结果?

标签 c# linq linq-to-entities

感谢您的关注!

背景

我正在用 C# 编写并使用 LINQ 来查询报告的实体。在这份报告中,我有一组基本上看起来像这样的实体:

Customer{
       Name: "Bob",
       ProductsPurchased: ArrayOfChildEntities[{
             ProductId: 1,
             ProductTypeId: 5,
             ProductName: "FooBuzz"
          },
          {...},
          {...}]
}

ProductsPurchased 是包含产品类型 ID 的子实体数组。假设我传入了用户从 View 中的过滤器列表中选择的类型 ID 数组:

var ProductTypesToShow = [1, 3, 5];

所以对于每个返回的客户,我只想显示他们购买的类型为 135 的产品. 如果客户从未购买过至少一种类型为 135 的产品,那么整个客户对象应该是从结果集中删除。

我尝试过的

我试过用这样的东西:

var customers = db.Customers.Where(c => c.ProductsPurchased.Select(p => ProductTypesToShow.Contains(p.ProductTypeId));

但这失败了。我还尝试了各种版本的 IntersectAny 但不幸的是,它们都因某种原因而失败,或者它们无法完成我需要的所有事情:

  1. 仅选择购买了类型为 135 的产品的客户。

  2. 在将数据发送回查看。

最后,我写了一个 foreach 怪兽,它迭代在初始查询中找到的所有客户,然后迭代他们的产品以按产品类型进行过滤,但这慢得令人无法接受(每个查询大约 3 分钟!! ).

我觉得我一定遗漏了一些明显的东西。任何建议表示赞赏!

最佳答案

很难说它是否可以与 LINQ to Entities 一起使用,但我会尝试一下:

var results = (from c in customers
               select new 
                   {
                       Name = c.Name,
                       Products = c.ProductsPurchased.Where(p => ProductTypesToShow.Contains(p.ProductTypeId))
                   } into c2
               where c2.Products.Any()
               select new
                   {
                       Name = c2.Name,
                       Products = c2.Products.ToArray()
                   }).ToArray();

它应该返回具有 2 个属性的匿名类型数组:NameProducts

关于c# - 如何使用 LINQ 根据子项和比较器之间的交叉值过滤和操作结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15906704/

相关文章:

.net - 为子查询提供表达式

c# - C# 中允许重复键的字典的替代方案是什么?

c# - 在 Enter 事件中设置焦点的替代方法

c# - 使用linq合并表类数据结构的有效方法

c# - 获取不同项目及其数量的列表

c# - NullReferenceException 包含 LINQ 表达式 MVC3

entity-framework - Linq to Entities 查询以选择最新的不同记录

C# 按 double 列表对字符串列表进行排序

c# - 如何在具有多个分支的项目中管理迁移?

c# - LINQ to Entities - where..in 多列子句