我有一些XML,其中包含付款信息,其中包括要应用付款的发票的详细信息。我想使用LINQ to XML仅收集应用于某些发票(111,222,333)的那些付款。如果是SQL,则可以使用IN(111,222,333)关键字,但是我不确定如何在LINQ中执行相同的操作。
<Payment>
<PaymentId>1</PaymentId>
<Total>50</Total>
<Invoice>
<Id>111</Id>
<Amount>20</Amount>
</Invoice>
<Invoice>
<Id>555</Id>
<Amount>30</Amount>
</Invoice>
</Payment>
<Payment>
<PaymentId>2</PaymentId>
<Total>20</Total>
<Invoice>
<Id>222</Id>
<Amount>20</Amount>
</Invoice>
</Payment>
<Payment>
<PaymentId>3</PaymentId>
<Total>80</Total>
<Invoice>
<Id>888</Id>
<Amount>80</Amount>
</Invoice>
</Payment>
LINQ
var result = xml.Select(x => x.Element("Payment"))
Where(x => x.Element("Id").Value.Contains("111","222","333"))
在此示例中,我想选择“ PaymentId 1”和“ PaymentId 2”,因为它们适用于ID匹配111、222或333的发票。
答案 0 :(得分:1)
您可以对这些知名ID的列表进行匹配/相交。
List<string> ids = new List<string> { "111", "222", "333" };
var result = xml
.Elements("Payment")
.Where(p => {
var invoiceIds = p.Elements("Invoice").Elements("Id").Select(o => o.Value);
return ids.Intersect(invoiceIds).Any();
}
);
完整代码和NetFiddle。
const string XML = @"
<root>
<Payment>
<PaymentId>1</PaymentId>
<Total>50</Total>
<Invoice>
<Id>555</Id>
<Amount>30</Amount>
</Invoice>
<Invoice>
<Id>111</Id>
<Amount>30</Amount>
</Invoice>
</Payment>
<Payment>
<PaymentId>2</PaymentId>
<Total>20</Total>
<Invoice>
<Id>222</Id>
<Amount>20</Amount>
</Invoice>
</Payment>
<Payment>
<PaymentId>3</PaymentId>
<Total>80</Total>
<Invoice>
<Id>888</Id>
<Amount>80</Amount>
</Invoice>
</Payment>
</root>
";
XElement xml = XElement.Parse(XML);
List<string> ids = new List<string> { "111", "222", "333" };
var result = xml
.Elements("Payment")
.Where(p => {
var invoiceIds = p.Elements("Invoice").Elements("Id").Select(o => o.Value);
return ids.Intersect(invoiceIds).Any();
}
);
foreach (var item in result)
{
Console.WriteLine("PaymentId: {0}", (string)item.Element("PaymentId"));
}