2013-03-07 56 views
0

我想了解如何將LINQ-to-XML和LINQ-to-SQL查詢結合起來並執行連接。在內部連接的XML元素中對結果進行分組

具體來說,我有一個SQL表,其中包含城市,縣和州的信息,我可以查詢它與LINQ to SQL,但在同一個查詢中,我想加入具有相同的SQL行州和/或縣,並生成XML作爲輸出的一部分。

這裏是大約什麼我的表如下所示:

╔═════╦══════════════╦════════════════╦═══════╗ 
║ IDX ║  CITY  ║ COUNTY  ║ STATE ║ 
╠═════╬══════════════╬════════════════╬═══════╣ 
║ 1 ║ YAKUTAT  ║ ALEUTIANS EAST ║ AK ║ 
║ 2 ║ city-1  ║ ALEUTIANS EAST ║ AK ║ 
║ 3 ║ city-2  ║ ALEUTIANS EAST ║ AK ║ 
║ 4 ║ city-3  ║ ALEUTIANS WEST ║ AK ║ 
║ 5 ║ city-4  ║ ALEUTIANS WEST ║ AK ║ 
║ 6 ║ city-5  ║ ALEUTIANS WEST ║ AK ║ 
║ 7 ║ xyz   ║ ANCHORAGE  ║ AK ║ 
║ 8 ║ abc   ║ BETHEL   ║ AK ║ 
║ 9 ║ lmnop  ║ WYOMING  ║ NY ║ 
║ 10 ║ pqrst  ║ WARSAW   ║ NY ║ 
║ 11 ║ defg   ║ WARSAW   ║ NY ║ 
╚═════╩══════════════╩════════════════╩═══════╝ 

這就是想什麼我我的XML輸出的樣子。我希望加入將同一縣的所有城市分組爲同一個縣節點下的節點,然後將所有縣作爲狀態節點的子節點進行分組。

<State>AK</State> 
    <County>ALEUTIANS EAST</County> 
    <City>YAKUTAT</City> 
    <City>city-1</City> 
    <City>city-2</City> 
    <County>ALEUTIANS WEST</County> 
    <City>city-3</City> 
    <City>city-4</City> 
    <City>city-5</City> 
    <County>ANCHORAGE</County> 
    <City>xyz</City> 
    <County>BETHEL</County> 
    <City>abc</City> 
<State>NY</State> 
    <County>WYOMING</County> 
    <City>lmnop</City> 
    <County>WARSAW</County> 
    <City>pqrst</City> 
    <City>defg</City> 

我有這個部分的工作,我能夠從我的數據庫成功地選擇行,我能寫輸出作爲XML,但我不能讓嵌套作爲子節點的市,縣數據狀態,我錯過了加入部分,並不清楚如何做到這一點。

XDocument xDoc = new XDocument(new XElement("States", 
    (from states in state.Database 
    select new XElement(new XElement("State",states.State), 
      new XElelment("County",states.County), 
      new XElelment("City",state.City)))); 

xDoc.Save("C:\\states.xml") 

這是我得到的輸出。正如你所看到的,我在沒有層次結構的情況下獲得了數據庫中所有城市,州和縣的完整列表。

<State>AK</State> 
<County>ALEUTIANS EAST</County> 
<City>YAKUTAT</City> 
<State>AK</State> 
<County>ALEUTIANS EAST</County> 
<City>city-1</City> 
<State>AK</State> 
<County>ALEUTIANS EAST</County> 
<City>city-2</City> 
<State>AK</State> 
<County>ALEUTIANS WEST</County> 
<City>city-3</City> 
<State>AK</State> 
<County>ALEUTIANS WEST</County> 
<City>city-4</City> 
....and so on.. 
+0

ok我想知道爲什麼版主們關閉了這個問題,你是否認爲我會浪費我的時間在註冊後問一個修辭問題......我使用了來自不同職位的數據,這只是因爲與我的項目有關的數據有perosnal細節.... – user2141957 2013-03-07 21:04:52

+0

@ user2141957這不是版主誰關閉你的問題,但社區的5個成員。關閉它的最可能的原因是因爲你確實沒有提出問題,或者至少是你寫這個問題的方式,所以很難弄清楚你問的是什麼。我認爲你的問題可能是可挽救的,但你需要提供一些澄清。具體來說,什麼是「國家」?它是一個集合嗎?你引用了一個SQL,但沒有跡象表明這是如何發揮作用的。 – psubsee2003 2013-03-08 00:51:11

+0

@ user2141957我會做的一個建議是閱讀這個博客條目:[寫出完美的問題](http://tinyurl.com/so-hints)。這是一篇非常好的文章,由我們的一位最高級別的成員撰寫,就如何寫出一個很好的問題來獲得良好的答案。這是非常有幫助 – psubsee2003 2013-03-08 00:53:29

回答

0

你真的有幾個不同的問題,第一個是你不能夠產生分層式XML文件(假設我理解你的原意之前,我編輯你的問題)。實際上,您的示例XML甚至沒有層次結構,因爲在嵌套下面的預期子標記之前關閉標記。像你在做的縮進不是創建任何類型的子節點,只是讓它看起來像。

這就是我想你想你的XML看起來像:

<State>AK 
    <County>ALEUTIANS EAST 
    <City>YAKUTAT</city> 
    <City>city-1</city> 
    </County> 
</State> 

但混合簡單類型如複雜的類型,如在同一節點中的其他節點的字符串可以非常混亂。我可以建議修改結構以使用屬性,從而消除一些令人困惑的層次結構。像這樣的結構會更普遍接受:

<State name = "AK"> 
    <County name = "ALEUTIANS EAST"> 
    <City>YAKUTAT</city> 
    <City>city-1</city> 
    </County> 
</State> 

生成嵌套的XML僅僅是安排對方

XElement stateElement = new XElement("State", new XAttribute("name", "AK"), 
          new XElement("County", new XAttribute("name", "ALEUTIANS EAST"), 
           new XElement("City", "YAKUTAT"), 
           new XElement("City", "city-1"))); 

內你XElement對象將產生與結構的XML我提出的問題以上。

您缺少的第二部分是連接。由於所有內容都位於同一個表中,因此您實際上正在查找組查詢,因爲您希望將單個共同父項下的子元素組合在一起。

我不是LINQ到SQL的期望,也可能是不同風格之間的字幕差異的事實,我不是100%確定語法將完全正確,但希望如果它是關閉,它仍然會讓你指向正確的方向。

請注意,僅僅因爲你正在創建一個XML文件,這不是LINQ到XML,LINQ是關於查詢源而不是輸出,並且因爲你正在查詢你的數據庫,所以這是LINQ-to- SQL

var query = from states in state.Database 
      group states by new { states.State, states.County } into countyGroup 
      group countyGroup by countyGroup.Key.State into stateGroup 
      select new XElement("State", new XAttribute("name", stateGroup.Key), 
         stateGroup.Select(st => new XElement("County", new XAttribute("name", st.Key.County), 
         st.Select(city => new XElement("City", city.City))))); 

var xdoc = new XDocument(new XDeclaration("1.0", "UTF-8", null), 
         new XElement("States", query.ToArray())); 

第一組語句將組中的所有數據庫中的行成組基於一個共同的縣和國家(這是必要的,包括國家,如果你排除橙色,佛羅里達和Orange之內的城市, CA將被分組在一起,第二組語句會將您的數據庫行進一步分組爲常見狀態,最終得到一個分組(稱爲stateGroup,它由在同一個縣的城市集合,以及在同一個城市集中的縣。

select語句將該分組分解爲適當的XML節點變得非常混亂,但它有效地寫出每個分組以便到達我想要去的地方。

(當你在你的問題中創建你的XDocument時,你也錯過了XML聲明,所以我在這裏添加了這個)。

+0

感謝大家給新手這樣一個詳細的解釋,你不僅澄清了我對linq-xml的困惑,而且更好地重構了我原來的問題。 – user2141957 2013-03-08 16:21:52

+0

@ user2141957但是現在你可以看到一個很好的框架問題可以做什麼的區別......在完成我的初始編輯5分鐘後,問題重新打開。你抱怨在這個問題上花了30分鐘......但說實話,我通常花費了那麼多時間在網站上寫下自己的問題。得到一個好問題需要很長時間。 – psubsee2003 2013-03-08 16:26:59

+0

@ user2141957我通常不會在自己的答案中這樣做,但如果您發現它有幫助,請不要忘記加註,並檢查答案標記是否解決了問題。 – psubsee2003 2013-03-08 16:27:30