如何使用LINQ分组By / Group Join XElement

时间:2013-06-21 10:51:36

标签: c# xml linq

我对查询感到震惊。请帮帮我。

我有一个xml

      <Set type="Main">
          <FirstUnit xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
            <CreateDate>2013-06-06T13:19:17.457</CreateDate>
            <PrimaryKey>1</PrimaryKey>
          </FirstUnit>
          <Secondunit  xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
            <CreateDate>2013-06-06T13:19:17.457</CreateDate>
            <PrimaryKey>1</PrimaryKey>
            <Exercise>Test</Exercise>
          </SecondUnit>
          <FirstUnit xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
            <CreateDate>2013-06-06T13:19:17.457</CreateDate>
            <PrimaryKey>2</PrimaryKey>
          </FirstUnit>
          <Secondunit  xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
            <CreateDate>2013-06-06T13:19:17.457</CreateDate>
            <PrimaryKey>2</PrimaryKey>
            <Exercise>Test</Exercise>
          </SecondUnit>
     </Set>

现在我想要的是根据主键对单元进行分组。即,FirstUnit和SecondUnit应该在一个组中具有<Primarykey>节点值“1”,在另一个组中具有PrimaryKey节点值“2”的那个。

我已经尝试过以下查询,还需要进行更多精炼,

var elements = xDocument.GroupBy(a => a.Elements().Descendants().Where(x => x.Name.LocalName == "PrimaryKey" ).ToList());

提前致谢。

1 个答案:

答案 0 :(得分:1)

在我看来,您只需要按照这些元素的进行分组:

// If <Set> is the document element, change Descendants("Set") to Root
var elements = xDocument.Descendants("Set")
                        .Elements()
                        .GroupBy(x => (int) x.Element("PrimaryKey"));

(如果需要,为元素提供一个命名空间 - 使用Where子句来检查本地名称有点难看。)

如果这不适合您,请详细说明您要做的事情。