PROJECT KySS(プロジェクト・キッス)
四国のSOHO。薬師寺 国安(フリーWebプログラマ)と,薬師寺 聖(デザイナ,個人事業所自営,http://www.SeinDesign.net/)によるコラボレーション・ユニット。XMLに関する記事や著書多数。両名とも,Microsoft MVP for Windows Server System - XML (Oct 2003-Sep 2008) http://www.PROJECTKySS.NET
 前回は,XMLツリーを生成・変更する方法について紹介した。今回は,LINQで使える演算子と関数について取り上げる。



 今回の開発に使った筆者の環境は,Visual Studio Team System 2008である。本稿で取り上げるのはASP.NETプログラムで,開発言語はVisual Basic。ASP.NETでLINQを試すなら,無料で公開されているVisual Web Developer 2008 Express Editionが,マイクロソフトのWebサイトからダウンロードできる。

 なお,本記事で紹介するサンプル・プログラムのソース・ファイル(zipアーカイブ)は,下記からダウンロードできる。
 04LINQtoXML.zip

セット演算子の使い方

 LINQには,条件付きの集合を取得するためのセット演算子がある。よく使われる演算子は表1の通りだ。これらの使い方を順に見ていこう。

表1●よく使われる演算子
演算子 機能 備考
Distinct 重複を削除 クエリーの範囲変数に対して
重複する結果を取り除く
distinct
Union 和集合を返す 二つ以上のノードセットの和集合を
文書順のままで取得
union
Intersect 積集合を返す オペランドの左側のクエリーと
右側のクエリーの結果セットを結合
intersect
Except 差集合を返す 左側のクエリーにあって
右側のクエリーにない値を返す
except

1.Distinct

 リスト1のXML文書を見てほしい。これは贈答用うどんセットの商品情報である。「きつねうどん」と「山菜うどん」については,セット数の異なる商品がある。このままデータを取り出すクエリーを記述すると,当然<品名>は重複して取得される。

 このような場合,<品名>要素が重複しないようにするには,Distinct句を使う。この句は,Select句の指定によって返されるすべての要素について,重複する値に適用される。

 重複しない<品名>をListBoxコントロールに表示するには,リスト2のように記述する(図1)。

<?xml version="1.0"?>
<商品情報>
    <商品>
        <品番>udon_01</品番>
        <品名>天ぷらうどん</品名>
        <セット内容 セット="5">うどん、かけつゆ、えび天ぷら、あげ巻き</セット内容>
        <価格>3500</価格>
    </商品>
    <商品>~</商品>略
    <商品>
        <品番>udon_03</品番>
        <品名>きつねうどん</品名>
        <セット内容  セット="4">うどん、かけつゆ、味付け油あげ、かまぼこ</セット内容>
        <価格>1500</価格>
    </商品>
    <商品>
        <品番>udon_04</品番>
        <品名>きつねうどん</品名>
        <セット内容  セット="10">うどん、かけつゆ、味付け油あげ、かまぼこ</セット内容>
        <価格>3750</価格>
    </商品>
    <商品>~</商品>略
    <商品>
        <品番>udon_08</品番>
        <品名>山菜うどん</品名>
        <セット内容 セット="10">うどん、かけつゆ、しいたけ、しめじ、山菜、かまぼこ</セット内容>
        <価格>2500</価格>
    </商品>
    <商品>
        <品番>udon_09</品番>
        <品名>山菜うどん</品名>
        <セット内容 セット="5">うどん、かけつゆ、しいたけ、しめじ、山菜、かまぼこ</セット内容>
        <価格>1250</価格>
    </商品>
    <商品>~</商品>略
</商品情報>
リスト1●<品名>が重複しているXML文書

リスト2●重複しない<品名>を取得する処理(一部)
リスト2●重複しない<品名>を取得する処理(一部)
[画像のクリックで拡大表示]

 (1)読み込んだXML文書の<商品>要素から,<商品>要素コレクションを参照している範囲変数(反復変数)cを用いて,<品名>の内容テキストを取得する。最後にDistinctを記述し,重複しない<品名>要素の値を取得するクエリーを定義する。

 (2)ListBoxコントロールのデータソースに,(1)で作成したクエリーを指定してデータをバインドする。これにより,重複しない<品名>要素の内容テキストがListBoxに表示される。

図1●Distinct演算子を使って,重複しない<品名>を取得した結果
図1●Distinct演算子を使って,重複しない<品名>を取得した結果