【发布时间】: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();
【问题讨论】: