感谢您的关注!
背景
我正在用 C# 编写并使用 LINQ 来查询报告的实体。在这份报告中,我有一组基本上看起来像这样的实体:
Customer{
Name: "Bob",
ProductsPurchased: ArrayOfChildEntities[{
ProductId: 1,
ProductTypeId: 5,
ProductName: "FooBuzz"
},
{...},
{...}]
}
ProductsPurchased
是包含产品类型 ID 的子实体数组。假设我传入了用户从 View 中的过滤器列表中选择的类型 ID 数组:
var ProductTypesToShow = [1, 3, 5];
所以对于每个返回的客户,我只想显示他们购买的类型为 1
、3
或 5
的产品. 如果客户从未购买过至少一种类型为 1
、3
或 5
的产品,那么整个客户对象应该是从结果集中删除。
我尝试过的
我试过用这样的东西:
var customers = db.Customers.Where(c => c.ProductsPurchased.Select(p => ProductTypesToShow.Contains(p.ProductTypeId));
但这失败了。我还尝试了各种版本的 Intersect
和 Any
但不幸的是,它们都因某种原因而失败,或者它们无法完成我需要的所有事情:
仅选择购买了类型为
1
、3
或5
的产品的客户。在将数据发送回查看。
最后,我写了一个 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 个属性的匿名类型数组:Name
和 Products
。
关于c# - 如何使用 LINQ 根据子项和比较器之间的交叉值过滤和操作结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15906704/