繁体   English   中英

Linq:匹配子对象列表中子对象 object 的属性,并从父对象列表中返回父对象 object

[英]Linq: Match to properties of child object in a list of child objects and return parent object from a list of parents

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

课程:

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 的 object,但是,对代码的测试会生成异常“序列不包含元素”。

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();

它可能更像

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”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM