检查列表项的一个属性与另一个属性的总和

时间:2019-08-08 20:36:25

标签: c# list linq sum

我有一个订单上的项目清单以及订单总数。我正在尝试找到一种方法,将所有已发货的数量加起来,并将其与总订单数量进行比较,以查看是否有任何“延期交货”。

我会返回一个PartInfo列表,其中包括该订单的所有产品发货。

public class PartInfo
{
        public int OrderId { get; set; }
        public string Name { get; set; }
        public string TrackingId { get; set; }
        public int ShippedQty { get; set; }
        public int OrderTotal { get; set; }
}

如果我使用以下数据:

List<PartInfo> PartList = new List<PartInfo>();
PartList.Add(new PartInfo() { OrderId = "1031",
                              Name = "Watch", 
                              TrackingId = "1Z204E380338943508", 
                              ShippedQty = 1, 
                              OrderTotal = 4});

PartList.Add(new PartInfo() { OrderId = "1031",  
                              Name = "Watch", 
                              TrackingId = "1Z51062E6893884735", 
                              ShippedQty = 2, 
                              OrderTotal = 4});

我如何使用LINQ将总ShippedQty与OrderTotal进行比较?

2 个答案:

答案 0 :(得分:1)

一个直接的答案可能是这样的:

var backOrdered = partList.GroupBy(p => new { p.OrderId, p.OrderTotal })
.Select(g => new
{
    g.Key.OrderId,
    g.Key.OrderTotal,
    TotalShipped = g.Sum(pi => pi.ShippedQty)
})
.Where(x => x.TotalShipped  < x.OrderTotal);

假设OrderIdOrderTotal始终处于链接状态,那么您可以对其进行分组,并且每个OrderId始终具有一个分组。

但是正如我在评论中所说,如果数据来自数据库,那么可能会有更好的方法来获取数据,尤其是。当Order的集合导航属性包含PartInfo时。

答案 1 :(得分:0)

我的理解是ShippedQty用于订单的单个项目(Name),因此您想按OrderId对项目进行分组并计算发货数量。在这种情况下,您可以使用group by LINQ:

var groupResults = PartList.GroupBy(
    // Group by OrderId
    x => x.OrderId,
    // Select collection of PartInfo based on the OrderId
    x => x,
    // For each group based on the OrderId, create a new anonymous type
    // and sum the total number of items shipped.
    (x,y) => new {
        OrderId = x,
        ShippedTotal = y.Sum(z => z.ShippedQty),
        OrderTotal = y.First().OrderTotal
    });

对于示例数据,这给出一个结果,即具有三个int属性的匿名类型(来自C#交互式控制台):

f__AnonymousType0#3<int, int, int>> { { OrderId = 1031, ShippedTotal = 3, OrderTotal = 4 } }

然后您可以过滤出结果以查看订单数量少于订单总数的地方

groupResults.Where(x => x.ShippedTotal < x.OrderTotal) ...