如何用LINQ筛选关联未结数量非零行项目的销售订单头?
解决方案
要获取关联存在未结数量大于零行项目的订单头且避免重复,有两种常用的LINQ写法:
方法一:使用Distinct/DistinctBy去重
在原查询基础上,通过去重方法过滤重复的订单头:
var orders = from so in _ctx.SalesOrders join soi in _ctx.SalesOrderItems on so.SalesOrderID equals soi.SalesOrderID where so.IsDeleted != true && so.IsCompleted != true && soi.IsDeleted != true && soi.QtyOutstanding > 0 select so; // .NET 6及以上推荐用DistinctBy,按订单ID精准去重 var distinctOrders = orders.DistinctBy(so => so.SalesOrderID).ToList(); // 若使用较低.NET版本,可通过匿名类中转后去重(避免实体引用比较问题) var distinctOrders = orders.Select(so => new { so.SalesOrderID, Order = so }) .Distinct() .Select(x => x.Order) .ToList();
方法二:使用Any直接判断(性能更优)
不需要显式关联查询,直接在订单头的过滤条件里判断是否存在符合要求的行项目,这种写法生成的SQL更简洁,执行效率更高:
var orders = _ctx.SalesOrders .Where(so => !so.IsDeleted && !so.IsCompleted && _ctx.SalesOrderItems.Any(soi => soi.SalesOrderID == so.SalesOrderID && !soi.IsDeleted && soi.QtyOutstanding > 0)) .ToList();
如果你的实体类已配置订单头与行项目的导航属性(比如so.OrderItems),写法可以更简洁:
var orders = _ctx.SalesOrders .Where(so => !so.IsDeleted && !so.IsCompleted && so.OrderItems.Any(soi => !soi.IsDeleted && soi.QtyOutstanding > 0)) .ToList();
内容的提问来源于stack exchange,提问作者Gordon Copestake
相关产品推荐
相关产品推荐

