【问题标题】:Linq to XML to populate parent/child relationshipLinq to XML 填充父/子关系
【发布时间】:2018-05-25 22:26:18
【问题描述】:

我想填充两个具有父子关系的对象。这两个对象是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;}
}

我想使用带有 Lambda 语法的 LINQ to XML 将 XML 数据放入对象中。我遇到的问题是获取信息的 API 调用返回多笔付款。但是,我可以为每次付款进行一次 API 调用,但当我可以进行一次 API 调用并传入我的所有付款 ID 并取回所有数据时,这将是低效的。问题是我对如何解析它以获取付款对象的集合感到困惑。是否可以或者我需要为每次付款进行单独的 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,但我在填充 PaymenModelInvoiceModelPaymentModel 的属性)时遇到问题。

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

【问题讨论】:

    标签: c# lambda linq-to-xml


    【解决方案1】:

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

    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" 的发票。

    【讨论】:

    • 如果我只想要发票包含"K" 的付款,我该如何调整它。目前它返回所有付款。
    • 要实现这一点,只需在xml.Descendants("payment") 之后添加.Where(x =&gt; x.Elements("invoice").Elements("invoiceId").Any(y =&gt; y.Value.Contains("K")))
    猜你喜欢
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多