0

LINQ-to-XMLクエリとLINQ-to-SQLクエリを組み合わせて、結合を実行する方法を理解しようとしています。

具体的には、市、郡、および州の情報を含む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..
4

1 に答える 1

0

実際にはいくつかの問題があります.1つ目は、階層的な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オブジェクトを互いの内部に配置するだけの問題です

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")));

上記で提案した構造を持つ XML を生成します。

あなたが欠けている2番目の部分は結合です。すべてが同じテーブルにあるため、単一の共通の親の下で子要素を結合したいので、実際にはグループ クエリを探しています。

私は LINQ-to-SQL に期待しているわけではありません。異なるフレーバー間でサブタイトルの違いがある可能性があるという事実から、構文が正確に正しいとは 100% 確信が持てませんが、うまくいけば、それがオフの場合はそうなるでしょう。それでも正しい方向に向けられます。

XMLファイルを作成しているという理由だけで、これはLINQ-to-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()));

最初のグループ ステートメントは、すべてのデータベース行を共通の郡と州に基づいてグループにグループ化します (フロリダ州オレンジとカリフォルニア州オレンジ内の都市を除外するかのように、州を含める必要があります。2 番目のグループは、ステートメントは、データベースの行をさらに共通の州にグループ化します. 最終的stateGroupには、同じ郡にある都市のコレクションと、同じ都市にグループ化された郡で構成されるグループ (と呼ばれる) になります。

適切な XML ノードへのグループ化を解除するための select ステートメントは非常に面倒ですが、目的の場所に到達するために各グループを効果的に書き出しています。

XDocument(質問で作成したときにXML宣言も見逃していたので、ここに追加しました)。

于 2013-03-08T10:21:29.257 に答える