Linq to XML 填充 parent/child 关系
Linq to XML to populate parent/child relationship
我想填充两个具有父子关系的对象。这两个对象是 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 获取信息的调用 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,但我在填充 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>();
如果我正确理解了这些要求,下面的代码应该会产生想要的结果:
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"
的发票。
我想填充两个具有父子关系的对象。这两个对象是 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 获取信息的调用 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,但我在填充 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>();
如果我正确理解了这些要求,下面的代码应该会产生想要的结果:
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"
的发票。