Linq to XML 填充 parent/child 关系

Linq to XML to populate parent/child relationship

我想填充两个具有父子关系的对象。这两个对象是 PaymentInvoice。每个 Payment 可能适用于多个 Invoice 对象,因为客户可能会写单笔付款以涵盖多张发票。

class Payment
{
    public string PaymentId {get; set;}
    public decimal PaymentAmount {get; set;}
    public List<Invoice> InvoiceCollection {get; set;} // Collection of Invoices
}

class Invoice
{
    public string InvoiceId {get; set;}
    public decimal InvoiceAmount {get; set;}
    public DateTime InvoiceDate {get; set;}
}

我想使用 LINQ to XML 和 Lambda 语法将 XML 数据获取到对象中。我 运行 遇到的问题是 API 获取信息的调用 return 多次付款。我可以为每笔付款进行一次 API 调用,但是,当我可以进行一次 API 调用并传递我的所有付款 ID 并取回所有数据时,效率会很低。问题是我对如何解析它以便取回 Payment 对象的集合感到困惑。是否有可能或我需要为每笔付款分别进行 API 调用?

<payment>
...
</payment>
<payment>
    <paymentId>7400</paymentId>
    <paymentAmount>540</paymentAmount>
    <paymentDate>05/22/2018</paymentDate>
    <invoice>
        <invoiceId>KADS333</invoiceId>
        <invoiceAmount>175</invoiceAmount>
        <invoiceDate>4/27/2018</invoiceDate>
    </invoice>
    <invoice>
        <invoiceId>53222</invoiceId>
        <invoiceAmount>300</invoiceAmount>
        <invoiceDate>4/04/2018</invoiceDate>
    </invoice>
    <invoice>
        <invoiceId>KAZO111</invoiceId>
        <invoiceAmount>65</invoiceAmount>
        <invoiceDate>3/12/2018</invoiceDate>
    </invoice>
</payment>
<payment>
...
</payment>

另外...我需要能够过滤掉 InvoiceId 中没有字母 K 的所有发票。例如 53222。 (这些是机场代码,K 始终出现在机场代码中。)

这是我开始使用的 Linq,但我在填充 PaymenModelInvoiceModel 时遇到问题,后者是 PaymentModel 的 属性。

List<PaymentModel> paymentDetails = xml.Descendants("payment")
        .Where(
            d => d.Element("invoiceId").Value.Contains("K")
        )
        .Select(x => new Invoice
        {
            InvoiceId = x.Element("invoiceId").Value.ToString(),
            InvoiceAmount = (decimal)x.Element("invoiceAmount"),
            InvoiceDate = (DateTime)x.Element("invoiceDate")
        }).ToList<InvoiceModel>();

如果我正确理解了这些要求,下面的代码应该会产生想要的结果:

List<Payment> paymentDetails = xml.Descendants("payment")
        .Select(x => new Payment()
        {
            PaymentId = x.Element("paymentId").Value,
            PaymentAmount = (decimal)x.Element("paymentAmount"),
            InvoiceCollection = x.Elements("invoice")
                .Where(i => i.Element("invoiceId").Value.Contains("K"))
                .Select(i => new Invoice()
                {
                    InvoiceId = i.Element("invoiceId").Value.ToString(),
                    InvoiceAmount = (decimal)i.Element("invoiceAmount"),
                    InvoiceDate = (DateTime)i.Element("invoiceDate")
                }).ToList()
        }).ToList();

它创建所有付款的列表,其中将包含 PaymentIdInvoiceCollection 等属性,其中包含 InvoiceId 包含 "K" 的发票。