|
今回の開発に使った筆者の環境は,Visual Studio Team System 2008である。本稿で取り上げるのはASP.NETプログラムで,開発言語はVisual Basic。ASP.NETでLINQを試すなら,無料で公開されているVisual Web Developer 2008 Express Editionが,マイクロソフトのWebサイトからダウンロードできる。 なお,本記事で紹介するサンプル・プログラムのソース・ファイル(zipアーカイブ)は,下記からダウンロードできる。 |
セット演算子の使い方
LINQには,条件付きの集合を取得するためのセット演算子がある。よく使われる演算子は表1の通りだ。これらの使い方を順に見ていこう。
表1●よく使われる演算子演算子 | 機能 | 備考 | |
---|---|---|---|
Distinct | 重複を削除 | クエリーの範囲変数に対して 重複する結果を取り除く |
![]() |
Union | 和集合を返す | 二つ以上のノードセットの和集合を 文書順のままで取得 |
![]() |
Intersect | 積集合を返す | オペランドの左側のクエリーと 右側のクエリーの結果セットを結合 |
![]() |
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</価格>
</商品>
<商品>~</商品>略
</商品情報>
| |
リスト2●重複しない<品名>を取得する処理(一部) [画像のクリックで拡大表示] |
(1)読み込んだXML文書の<商品>要素から,<商品>要素コレクションを参照している範囲変数(反復変数)cを用いて,<品名>の内容テキストを取得する。最後にDistinctを記述し,重複しない<品名>要素の値を取得するクエリーを定義する。
(2)ListBoxコントロールのデータソースに,(1)で作成したクエリーを指定してデータをバインドする。これにより,重複しない<品名>要素の内容テキストがListBoxに表示される。
|
|
図1●Distinct演算子を使って,重複しない<品名>を取得した結果 |