感谢您的关注!
背景
我正在用 C# 编写并使用 LINQ 查询实体以获取报告。在这份报告中,我有一组基本上如下所示的实体:
Customer{
Name: "Bob",
ProductsPurchased: ArrayOfChildEntities[{
ProductId: 1,
ProductTypeId: 5,
ProductName: "FooBuzz"
},
{...},
{...}]
}
ProductsPurchased
是包含产品类型 ID 的子实体数组。假设我传入了用户从视图中的过滤器列表中选择的类型 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
。在这些客户中,删除任何不属于 、 或 类型的产品
1
,3
然后5
再将数据发送回视图。
最后,我写了一个foreach
怪物,它迭代在初始查询中找到的所有客户,然后迭代他们的产品以按产品类型进行过滤,但这慢得让人无法接受(每个查询大约需要 3 分钟!!)。
我觉得我必须在这里遗漏一些明显的东西。任何建议表示赞赏!