gpt4 book ai didi

c# - 汇总两个连接表的总计时的空引用

转载 作者:行者123 更新时间:2023-12-02 09:17:54 25 4
gpt4 key购买 nike

对于每个零件,我想汇总仓库中的现有零件和分配零件以及订单行中的订单零件的总数。

我正在 LINQPad 中使用简化版本:

void Main()
{
var partQuantities = (
from part in Parts()

join orderLine in OrderLines()
on part.PartID equals orderLine.PartID
into orderLineLeftJoin
from orderLine in orderLineLeftJoin.DefaultIfEmpty()

join warehouse in Warehouses()
on part.PartID equals warehouse.PartID
into warehouseLeftJoin
from warehouse in warehouseLeftJoin.DefaultIfEmpty()

group new { warehouse, orderLine } by part into partQtys

/*
select partQtys
// */

// /*
select new
{
partQtys.Key.PartID,
OnHandQty = partQtys.Sum(partQty => partQty.warehouse.OnHandQty),
AllocatedQty = partQtys.Sum(partQty => partQty.warehouse.AllocatedQty),
OrderQty = partQtys.Sum(partQty => partQty.orderLine.OrderQty)
}
// */
).Dump();
}

class Part { public string PartID; }
private Part[] Parts() { return new Part[] {new Part { PartID = "PartA" },new Part { PartID = "PartB" },new Part { PartID = "PartC" },new Part { PartID = "PartD" },new Part { PartID = "PartE" },new Part { PartID = "PartF" }}; }

class Warehouse { public string WarehouseID; public string PartID; public int OnHandQty; public int AllocatedQty; }
private Warehouse[] Warehouses() { return new Warehouse[] {new Warehouse { WarehouseID = "Whse1", PartID = "PartA", OnHandQty =101, AllocatedQty = 21 },new Warehouse { WarehouseID = "Whse1", PartID = "PartB", OnHandQty =102, AllocatedQty = 22 },new Warehouse { WarehouseID = "Whse1", PartID = "PartC", OnHandQty =103, AllocatedQty = 23 },new Warehouse { WarehouseID = "Whse1", PartID = "PartD", OnHandQty =104, AllocatedQty = 24 },new Warehouse { WarehouseID = "Whse2", PartID = "PartC", OnHandQty =105, AllocatedQty = 25 },new Warehouse { WarehouseID = "Whse2", PartID = "PartD", OnHandQty =106, AllocatedQty = 26 },new Warehouse { WarehouseID = "Whse2", PartID = "PartE", OnHandQty =107, AllocatedQty = 27 },new Warehouse { WarehouseID = "Whse2", PartID = "PartF", OnHandQty =108, AllocatedQty = 28 }}; }

class OrderLine { public string OrderID; public string PartID; public int OrderQty; }
private OrderLine[] OrderLines() { return new OrderLine[] {new OrderLine { OrderID = "Order1", PartID = "PartB", OrderQty = 71 }, new OrderLine { OrderID = "Order1", PartID = "PartF", OrderQty = 72 },new OrderLine { OrderID = "Order2", PartID = "PartD", OrderQty = 73 }, new OrderLine { OrderID = "Order2", PartID = "PartF", OrderQty = 74 }}; }

但这会引发 NullReferenceException,因为并非所有零件都有仓库库存和订单。

编辑:我已经排除了 Gilad 的 null 传播运算符,因为未简化的版本是表达式树 Lambda,并且我收到编译错误。虽然这在 LinqPad 中可以工作。

如何汇总两个表中的数据?

最佳答案

使用空传播?.运算符:

select new
{
partQtys.Key.PartID,
OnHandQty = partQtys.Sum(partQty => partQty.warehouse?.OnHandQty),
AllocatedQty = partQtys.Sum(partQty => partQty.warehouse?.AllocatedQty),
OrderQty = partQtys.Sum(partQty => partQty.orderLine?.OrderQty)
}

您可以在 DefaultIfEmpy 下的 left join 中查看其用法说明


根据您的评论和您收到的错误,请查看:Why can't I use the null propagation operator in lambda expressions?如果这确实是您的情况,请改用 ?: 运算符:

OnHandQty = partQtys.Sum(p => p.warehouse == null ? 0 : p.warehouse.OnHandQty)

关于c# - 汇总两个连接表的总计时的空引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45188452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com