[英]How to use Linq to select and group complex child object from a parents list
[英]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.