Linq to XML для заполнения родительских / дочерних отношений - PullRequest
0 голосов
/ 26 мая 2018

Я хотел бы заполнить два объекта, которые имеют родительские дочерние отношения.Два объекта Payment и Invoice.Каждый 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, который получает информацию, возвращает несколько платежей.Однако я мог бы сделать один вызов API для каждого платежа, что было бы неэффективно, если бы я мог сделать один вызов API, передав все свои идентификаторы платежей и вернув все данные.Проблема в том, что я запутался в том, как разобрать его, чтобы получить коллекцию объектов 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>

Кроме того ... Мне нужно иметь возможность отфильтровывать счета, которые не имеют буквы K вInvoiceId.Например 53222.(Это коды аэропортов, и K всегда присутствует в коде аэропорта.)

Вот Linq, с которого я начал, но у меня проблемы с заполнением PaymenModel, а также InvoiceModel, которыйсобственность 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>();

1 Ответ

0 голосов
/ 26 мая 2018

Если я правильно понял требования, следующий код должен дать желаемый результат:

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

Он создает список всех платежей, который будет содержать свойства, такие как PaymentId и InvoiceCollection, которыесодержит счета, где InvoiceId содержит "K".

...