2013-06-21 85 views
0

我遇到了一個查詢。請幫助我。如何使用LINQ GroupBy/Group加入XElements

我有一個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

在我看來,你只需要組由值的那些元素:如果有必要

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

(提供一個命名空間的元素 - 使用Where子句來檢查只是本地名稱有點難看)。

如果這不適合你,請給出你想要做的更多細節。

+0

謝謝你的快速回復喬恩,我只是輸出爲列表與兩個項目。應該有第一個「FirstUnit」和「SecondUnit」。其他應該有第二個「FirstUnit」和「SecondUnit基於主鍵」 – Baks