如何用LINQ获取所有订单已发货的公司ID列表?
如何用LINQ获取所有订单已发货的公司ID列表
原代码问题分析
你的代码使用了两层Any(),逻辑是只要公司存在至少一个客户有已发货订单就会被选中。但这不符合需求——我们需要的是公司旗下所有客户的所有订单都已发货,没有任何未发货的订单。
正确的LINQ写法
写法一:嵌套使用All()
通过All()确保层级上的所有元素都满足条件:
var companyIds = Companies .Where(co => co.Customers.All(cu => cu.Orders.All(o => o.Shipped))) .Select(co => co.CompanyID) .ToList();
逻辑说明:
- 外层
co.Customers.All(...):公司的每一个客户都要满足后续条件; - 内层
cu.Orders.All(o => o.Shipped):该客户的所有订单都已发货; - 若客户没有订单,
cu.Orders.All(...)会返回true(空集合的All操作默认判定为满足条件),这类客户不会影响结果。
写法二:反向排除未达标公司
通过!Any()排除存在未发货订单的公司,逻辑更直观:
var companyIds = Companies .Where(co => !co.Customers.Any(cu => cu.Orders.Any(o => !o.Shipped))) .Select(co => co.CompanyID) .ToList();
逻辑说明:
- 内层
cu.Orders.Any(o => !o.Shipped):检查客户是否存在未发货订单; - 外层
!co.Customers.Any(...):排除所有存在这类客户的公司,剩下的就是所有订单都已发货的公司。
结果验证
根据你的表数据:
- CompanyA存在未发货订单(OrderID 5),会被排除;
- CompanyB、CompanyC的所有订单均已发货,最终返回
[2, 3],符合预期。
内容的提问来源于stack exchange,提问作者user3296355
相关产品推荐
相关产品推荐

