我有一个订单上的项目清单以及订单总数。我正在尝试找到一种方法,将所有已发货的数量加起来,并将其与总订单数量进行比较,以查看是否有任何“延期交货”。
我会返回一个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进行比较?
答案 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);
假设OrderId
和OrderTotal
始终处于链接状态,那么您可以对其进行分组,并且每个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) ...