« Linq to XML 入門その2 (基本的ななクエリー) | メイン | 「タッチスクリーン上に物理ボタンを出現・格納」新技術(動画) | WIRED VISION »

2009年05月17日

Liunq to XML 入門 その3 (Linq クエリ構文)

今回は予定を変えてLinqのクエリ式の構文について説明します。前回クエリの方法について説明しましたが、クエリ式の構文についての説明はしていなかったので、前回説明した基本的なクエリ式の構文について説明します。

基本的なクエリ

Linqでの基本的なクエリ式は以下のようになります。

   1: from [範囲変数] in [データソース]
   2: select [範囲変数]

まず、クエリ式はfrom句から始める必要があります。つぎに最低でもselect句で範囲変数を指定し、最終的に式が返すソースシーケンスの内容を確定します。

from句

from [範囲変数] in [データソース]

from句ではクエリもしくはサブクエリの対象となるデータソースとソースシーケンス内の各要素を表すローカルの範囲変数を指定します。ソースシーケンスとはデータソースの中でLinq式内での各操作の対象となる連続したデータのことです。

LinqのデータソースにはIEnumerable<T>インターフェイスあるいはIEnumerableとその派生インターフェイスを実装したオブジェクトだけを指定することができます。通常の配列やArrayList、ADO.NETのデータセットはIEnumerableインターフェイスを持つのでLinqの対象とすることができます。

selsct句

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 [条件式]

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クエリ式の処理シーケンス

ここまで何となくわかってきたと思いますが、Linqクエリ式の構文はSQLのクエリ言語のような人間にわかりやすくというよりも、身も蓋もなくLinq内の処理の順序で記述します。

Linq式の処理シーケンスはfrom句でデータソースからソースシーケンスという処理対象を取り出し次に渡し、where句でそれにフィルタリングをかけ、さらにその処理対象を減らしたデータを次の処理に渡し、select句で受け取ったデータの型の変換を行い、それを式の結果として返すようになっています。

Linq式はいつ実行されているのか

Linq式はLinq式の結果が変数に保存され、Linq式の結果に対して処理が実行されているように思えますが、実際にはC#のコードで変数に格納されるタイミングでは式の評価、実行はされずに、実際にLinq式が実行されるのは、それが使われるタイミングです。上のコード例であれば、foreach文が実行されるときにLinq式が実行されます。

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の基礎的な使い方についてまとめ... [続きを読む]

コメント

 

コメントしてください




保存しますか?


                 あわせて読みたい
クリエイティブ・コモンズ・ライセンス
このブログは、次のライセンスで保護されています。 クリエイティブ・コモンズ・ライセンス.