You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 13:33:15