« Linq to XML 入門その2 (基本的ななクエリー) | メイン | 「タッチスクリーン上に物理ボタンを出現・格納」新技術(動画) | WIRED VISION »
今回は予定を変えてLinqのクエリ式の構文について説明します。前回クエリの方法について説明しましたが、クエリ式の構文についての説明はしていなかったので、前回説明した基本的なクエリ式の構文について説明します。
Linqでの基本的なクエリ式は以下のようになります。
1: from [範囲変数] in [データソース]
2: select [範囲変数]
まず、クエリ式はfrom句から始める必要があります。つぎに最低でもselect句で範囲変数を指定し、最終的に式が返すソースシーケンスの内容を確定します。
from [範囲変数] in [データソース]
from句ではクエリもしくはサブクエリの対象となるデータソースとソースシーケンス内の各要素を表すローカルの範囲変数を指定します。ソースシーケンスとはデータソースの中でLinq式内での各操作の対象となる連続したデータのことです。
LinqのデータソースにはIEnumerable<T>インターフェイスあるいはIEnumerableとその派生インターフェイスを実装したオブジェクトだけを指定することができます。通常の配列やArrayList、ADO.NETのデータセットはIEnumerableインターフェイスを持つのでLinqの対象とすることができます。
select [式]
selsct句はクエリ式が実行されたときに生成される値の型を指定します。クエリ式の結果はselect句の前の式の評価およびselect句の式の評価によって生成されます。
select句の一番単純な例は式に範囲変数を指定し、ソースシーケンスをそのまま式の値にすることですが、以下の例のようにこの式でデータ変換をすることができます。
1: XDocument rss = XDocument.Load(@"http://www.isisaka.com/blog/index.xml");
2: //select句でデータ変換する
3: IEnumerable<DateTime> query = from x in rss.Element("rss").Elements("channel").Elements("item")
4: select DateTime.Parse(x.Element("pubDate").Value);
5: foreach (var d in query) {
6: Console.WriteLine(d.ToLongDateString());
7: }
この例では4行のselect句の式でXMLのバリュー(string型)のデータをDateTime型に変換しているので、クエリ式の結果をIEnumerble<DateTime>型の変数に格納することができます。
先ほどのもっとも単純なクエリ式ではソースシーケンスのデータに対し、なんのフィルタリングもかけずに値を返していましたが、実際には何らかのフィルタリング条件をつけて必要なデータだけをソースシーケンスから取り出したいことが多いと思います。
クエリ式において、このフィルタリング条件を指定するのがwhere句です。
1: from [範囲変数] in [データソース]
2: whewe [条件式]
3: select [式]
where [条件式]
where句はソースシーケンスの中からどんな要素を取り出すのかを条件式で指定します。
以下に例を示します。
1: XDocument rss = XDocument.Load(@"http://www.isisaka.com/blog/index.xml");
2: //select句でデータ変換する
3: IEnumerable<DateTime> query = from x in rss.Element("rss").Elements("channel").Elements("item")
4: where DateTime.Parse(x.Element("pubDate").Value) > DateTime.Parse("2009/5/11")
5: select DateTime.Parse(x.Element("pubDate").Value);
6:
7: foreach (var d in query) {
8: Console.WriteLine(d.ToLongDateString());
9: }
この例ではpubDateエレメントの値が設定された日付以降の日付のデータだけを取り出しています。
ここまで何となくわかってきたと思いますが、Linqクエリ式の構文はSQLのクエリ言語のような人間にわかりやすくというよりも、身も蓋もなくLinq内の処理の順序で記述します。
Linq式の処理シーケンスはfrom句でデータソースからソースシーケンスという処理対象を取り出し次に渡し、where句でそれにフィルタリングをかけ、さらにその処理対象を減らしたデータを次の処理に渡し、select句で受け取ったデータの型の変換を行い、それを式の結果として返すようになっています。
Linq式はLinq式の結果が変数に保存され、Linq式の結果に対して処理が実行されているように思えますが、実際にはC#のコードで変数に格納されるタイミングでは式の評価、実行はされずに、実際にLinq式が実行されるのは、それが使われるタイミングです。上のコード例であれば、foreach文が実行されるときにLinq式が実行されます。
foreach文のタイミングで実行ではなく、foreach文ではない処理のためにLinq式の結果をメモリ上で確定してしまいたい場合があります。その場合にはLinq式の結果を格納する変数のToListメソッドやToArrayメソッドを使用して、メモリ上にクエリデータを格納することができます。
以下にその例を示します。
1: XDocument rss = XDocument.Load(@"http://www.isisaka.com/blog/index.xml");
2: //select句でデータ変換する
3: IEnumerable<DateTime> query = from x in rss.Element("rss").Elements("channel").Elements("item")
4: where DateTime.Parse(x.Element("pubDate").Value) > DateTime.Parse("2009/5/11")
5: select DateTime.Parse(x.Element("pubDate").Value);
6: //データをメモリ上に確定する
7: IList<DateTime> list = query.ToList();
8:
9: Console.WriteLine(list[1].ToLongDateString());
この例では7秒目でToListメソッドを使ってLinq式の結果をメモリ上に確定しています。
これの詳しい話についてはMSDNライブラリの「クエリの結果をメモリに格納する (C# プログラミング ガイド)」を参照してください。
それでは、また次回。
このエントリーのトラックバックURL:
http://www.isisaka.com/blog/mt-tb.cgi/3161
このリストは、次のエントリーを参照しています: Liunq to XML 入門 その3 (Linq クエリ構文):
» Linq to XML 入門その1 (XML文書の作り方)
from OPC Diary
準備 これから数回に分けてLinq to XMLの基礎的な使い方についてまとめ...
[続きを読む]
コメント
コメントしてください