Linq to xml multiple group by子句

时间:2013-06-18 11:33:55

标签: linq-to-xml grouping

在阅读了很多关于LINQ to XML的帖子以及许多使用分组的试验后,我现在已经形成了以下LINQ查询:

    Dim objList = (From i In xmlDoc.Descendants("payment_amnt")
                   Group CType(i.Value, Decimal)
                   By Key = i.Parent.Element("account_id").Value.ToString() Into g = Group
                   Select New With {.ItemName = Key, .Sum = g.Sum()}).ToList()

我想添加另一个组密钥(“payment_mnth”)但是当我这样做时:

    By Key = i.Parent.Element("account_id").Value.ToString(), Key = i.Parent.Element("payment_mnth").Value.ToString() Into g = Group

我收到错误。

如何向此查询添加第二个组密钥?

提前致谢。

斯蒂芬

PS:在Davids反馈之后我将以下内容添加到linqpad中并得到此错误:对象引用未设置为对象的实例。

Dim xmlDoc As XDocument = XDocument.Load("c:\\Backup\PAYMENT.xml")

Dim objList = (From i In xmlDoc.Descendants("payment_amnt")
               Group CType(i.Value, Decimal)
               By AccountId = i.Parent.Element("account_id").Value.ToString(), PaymentMonth = i.Parent.Element("payment_mnth").Value.ToString() Into g = Group
                Select New With {AccountId, PaymentMonth, g.Sum()}).ToList()


objList.Dump()

似乎是'By'部分中的AccountId导致错误。我的XML如下:

<?xml version="1.0" encoding="utf-8"?>
<PAYMENT xmlns="urn:lst-emp:emp">
  <PAYMENT xmlns="">
    <id>1</id>
    <paymentdate>17/06/2013</paymentdate>
    <payment_no>1</payment_no>
    <payment_to_id>1</payment_to_id>
    <PAYMENT_TO>PWA</PAYMENT_TO>
    <payment_type_id>1</payment_type_id>
    <PAYMENT_TYPE>Computer Services</PAYMENT_TYPE>
    <payment_request>Stephen</payment_request>
    <payment_amnt>100</payment_amnt>
    <comment></comment>
    <payment_checked>0</payment_checked>
    <GST>9.09</GST>
    <payment_month>Jun</payment_month>
    <account_id_transfer />
    <account_id>1</account_id>
  </PAYMENT>
  <PAYMENT xmlns="">
    <id>2</id>
    <paymentdate>17/06/2013</paymentdate>
    <payment_no>2</payment_no>
    <payment_to_id>1</payment_to_id>
    <PAYMENT_TO>PWA</PAYMENT_TO>
    <payment_type_id>1</payment_type_id>
    <PAYMENT_TYPE>Computer Services</PAYMENT_TYPE>
    <payment_request>Stephens</payment_request>
    <payment_amnt>1000</payment_amnt>
    <comment></comment>
    <payment_checked>0</payment_checked>
    <GST>90.91</GST>
    <payment_month>Jun</payment_month>
    <account_id_transfer />
    <account_id>1</account_id>
  </PAYMENT>
  <PAYMENT xmlns="">
    <id>3</id>
    <paymentdate>17/06/2013</paymentdate>
    <payment_no>3</payment_no>
    <payment_to_id>1</payment_to_id>
    <PAYMENT_TO>PWA</PAYMENT_TO>
    <payment_type_id>1</payment_type_id>
    <PAYMENT_TYPE>Computer Services</PAYMENT_TYPE>
    <payment_request>Stephen</payment_request>
    <payment_amnt>145</payment_amnt>
    <comment></comment>
    <payment_checked>0</payment_checked>
    <GST>13.18</GST>
    <payment_month>Jun</payment_month>
    <account_id_transfer />
    <account_id>1</account_id>
  </PAYMENT>
</PAYMENT>

2 个答案:

答案 0 :(得分:0)

您尝试将两个密钥中的account_id放入...

还有什么是“关键”对象?据我所知,你不需要这个,这可能是你的一些错误的来源

您可以尝试以下方法:

By i.Parent.Element("account_id").Value.ToString(), i.Parent.Element("payment_mnth").Value.ToString()
编辑:好的,我认为这是因为我不熟悉VB。我现在看到了什么“钥匙”,所以如果你愿意,你可以忽略它。

您可以在https://stackoverflow.com/a/4647477/1341477

找到错误原因

要纠正它,您可以执行以下操作:

By AccountId = i.Parent.Element("account_id").VAlue.ToString(), 
   PaymentMonth = i.Parent.Element("payment_mnth").Value.ToString() Into g = Group
Select New With {AccountId, PaymentMonth, g.Sum()}

答案 1 :(得分:0)

所有这些导致以下

Dim xmlDoc As XDocument = XDocument.Load("c:\\Backup\PAYMENT.xml")

Dim objList = From item In xmlDoc.Descendants("payment_amnt")
               group CType(item.Value, Decimal)
               by Key = item.Parent.Element("account_id").Value.ToString(), item2 = item.Parent.Element("payment_month").Value.ToString() into g = Group
                Select New With { .acc_id = Key,.p_month = item2, .Sum = g.Sum() }


objList.Dump()

感谢Dave的帮助。没有它就不会到这里。

相关问题