【问题标题】:Linq: Match to properties of child object in a list of child objects and return parent object from a list of parentsLinq:匹配子对象列表中子对象的属性并从父对象列表中返回父对象
【发布时间】:2021-03-07 07:36:55
【问题描述】:

我正在尝试编写一个 Linq 查询以返回一个父对象,该父对象通过匹配其子对象之一的属性来标识。我的课程是一个销售订单,它有一个交付列表,而交付列表又包含一个 LineItems 列表。当 Delivery 的 LineItems 中的 Item Number 和 Line Number 属性匹配时,我想返回一个 Delivery 对象。

类:

public class SalesOrderDetail 
{
    [JsonProperty("SalesOrderNumber")]
    public string SalesOrderNumber { get; set; }

    [JsonProperty("PONumber")]
    public string PONumber { get; set; }

    [JsonProperty("Status")]
    public string Status { get; set; }

    [JsonProperty("Deliveries")]
    public List<Delivery> Deliveries { get; set; }
}

public class Delivery
{
    [JsonProperty("DeliveryDocumentNumber")]
    public string DeliveryDocumentNumber { get; set; }

    [JsonProperty("DeliveryStatus")]
    public string DeliveryStatus { get; set; }

    [JsonProperty("Parcels")]
    public List<Parcel> Parcels { get; set; }

    [JsonProperty("LineItems")]
    public List<LineItem> LineItems { get; set; }

    [JsonProperty("ShippedDate")]
    public DateTime ShippedDate { get; set; }
}

public class LineItem
{
    [JsonProperty("DeliveryDocumentLineNumber")]
    public int DeliveryDocumentLineNumber { get; set; }

    [JsonProperty("OrderLineNumber")]
    public int OrderLineNumber { get; set; }

    [JsonProperty("ItemNumber")]
    public string ItemNumber { get; set; }

    [JsonProperty("QuantityOrdered")]
    public int QuantityOrdered { get; set; }

    [JsonProperty("QuantityPicked")]
    public int QuantityPicked { get; set; }

    [JsonProperty("QuantityScanned")]
    public int QuantityScanned { get; set; }

    [JsonProperty("QuantityShipped")]
    public int QuantityShipped { get; set; }

    [JsonProperty("QuantityCanceled")]
    public int QuantityCanceled { get; set; }

    [JsonProperty("LineItemDetails")]
    public List<LineItemDetail> LineItemDetails { get; set; }
}

示例 JSON:

{
    "SalesOrderNumber": "0017320457",
    "PONumber": "PON0234250",
    "Status": "Completely Shipped",
    "Deliveries": [
        {
            "DeliveryDocumentNumber": "0088148528",
            "DeliveryStatus": "Shipped",
            "Parcels": [
                {
                    "CartonNumber": "00093456780095683506",
                    "CarrierCode": "FEDG",
                    "TrackingType": "TRACKING",
                    "TrackingNumber": "946346636541",
                    "Weight": 12.22,
                    "WeightUOM": "LB"
                }
            ],
            "LineItems": [
                {
                    "DeliveryDocumentLineNumber": 10,
                    "OrderLineNumber": 10,
                    "ItemNumber": "SYM-LS2208SR20007RUR",
                    "QuantityOrdered": 1,
                    "QuantityPicked": 0,
                    "QuantityScanned": 0,
                    "QuantityShipped": 1,
                    "QuantityCanceled": 0,
                    "LineItemDetails": [
                        {
                            "CartonNumber": "00093456780095683506",
                            "SerialNumber": "SZ3M7Z8",
                            "MACAddress": null,
                            "MACAddressUnformatted": null
                        }
                    ]
                },
            ],
            "ShippedDate": "2021-03-05T03:32:43.903"
        }
    ]
    "Deliveries": [
        {
            "DeliveryDocumentNumber": "0088148351",
            "DeliveryStatus": "Shipped",
            "Parcels": [
                {
                    "CartonNumber": "000934567800956835901",
                    "CarrierCode": "FEDG",
                    "TrackingType": "TRACKING",
                    "TrackingNumber": "946346636443",
                    "Weight": 10.24,
                    "WeightUOM": "LB"
                }
            ],
            "LineItems": [
                {
                    "DeliveryDocumentLineNumber": 20,
                    "OrderLineNumber": 20,
                    "ItemNumber": "ZEB-ZD62142T01F00EZ",
                    "QuantityOrdered": 1,
                    "QuantityPicked": 0,
                    "QuantityScanned": 0,
                    "QuantityShipped": 1,
                    "QuantityCanceled": 0,
                    "LineItemDetails": [
                        {
                            "CartonNumber": "000934567800956835901",
                            "SerialNumber": "D1N204401680",
                            "MACAddress": null,
                            "MACAddressUnformatted": null
                        }
                    ]
                },
            ],
            "ShippedDate": "2021-03-04T03:32:43.903"
        }
    ]
}

我开始思考这个问题的方式是编写以下代码。 Intellisense 声明它将返回一个 Delivery 类型的对象,但是,对代码的测试会生成异常“序列不包含任何元素”。

int lineNumber = 10;
string itemNumber = "SYM-LS2208SR20007RUR";

var matchedDelivery = salesOrderDetail.Deliveries.Where(f => f.LineItems == f.LineItems.Where(l => (l.ItemNumber == itemNumber) && (l.OrderLineNumber == lineNumber))).First();

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    可能更像

    var matchedDeliveries = salesOrderDetail.Deliveries
      .Where(d => d.LineItems.Any(li => li.ItemNumber == itemNumber && li.OrderLineNumber == lineNumber));
    

    或者,如果您想要一次交付,请将 Where 换成 First(或者如果您想要一个例外,如果有多个,则换成 Single)

    这应该读起来很自然,但如果它有助于理解的话,它是“在所有交付中,交付的 lineitems 的任何成员都有一个 itemNumber of blah 和 orderLineNumber of blahblah”

    【讨论】:

    • 单元测试通过!谢谢。
    猜你喜欢
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 2021-04-12
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    相关资源
    最近更新 更多