スポンサーリンク

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

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

基本的なクエリ

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<span class="hljs-keyword">from</span> [範囲変数] <span class="hljs-keyword">in</span> [データソース]
<span class="hljs-keyword">select</span> [範囲変数]
<span class="hljs-keyword">from</span> [範囲変数] <span class="hljs-keyword">in</span> [データソース] <span class="hljs-keyword">select</span> [範囲変数]
from [範囲変数] in [データソース]
select [範囲変数]

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

from句

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

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

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

selsct句

select [式]

selsct句はクエリ式が実行されたときに生成される値の型を指定します。クエリ式の結果はselect句の前の式の評価およびselect句の式の評価によって生成されます。

select句の一番単純な例は式に範囲変数を指定し、ソースシーケンスをそのまま式の値にすることですが、以下の例のようにこの式でデータ変換をすることができます。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
XDocument rss = XDocument.<span class="hljs-constructor">Load(@<span class="hljs-string">"http://www.isisaka.com/blog/index.xml"</span>)</span>;
<span class="hljs-comment">//select句でデータ変換する </span>
IEnumerable<datetime> query = from x <span class="hljs-keyword">in</span> rss.<span class="hljs-constructor">Element(<span class="hljs-string">"rss"</span>)</span>.<span class="hljs-constructor">Elements(<span class="hljs-string">"channel"</span>)</span>.<span class="hljs-constructor">Elements(<span class="hljs-string">"item"</span>)</span>
select DateTime.<span class="hljs-constructor">Parse(<span class="hljs-params">x</span>.Element(<span class="hljs-string">"pubDate"</span>)</span>.Value);
foreach (var d <span class="hljs-keyword">in</span> query) {
Console.<span class="hljs-constructor">WriteLine(<span class="hljs-params">d</span>.ToLongDateString()</span>);
}</datetime>
XDocument rss = XDocument.<span class="hljs-constructor">Load(@<span class="hljs-string">"http://www.isisaka.com/blog/index.xml"</span>)</span>; <span class="hljs-comment">//select句でデータ変換する </span> IEnumerable<datetime> query = from x <span class="hljs-keyword">in</span> rss.<span class="hljs-constructor">Element(<span class="hljs-string">"rss"</span>)</span>.<span class="hljs-constructor">Elements(<span class="hljs-string">"channel"</span>)</span>.<span class="hljs-constructor">Elements(<span class="hljs-string">"item"</span>)</span> select DateTime.<span class="hljs-constructor">Parse(<span class="hljs-params">x</span>.Element(<span class="hljs-string">"pubDate"</span>)</span>.Value); foreach (var d <span class="hljs-keyword">in</span> query) { Console.<span class="hljs-constructor">WriteLine(<span class="hljs-params">d</span>.ToLongDateString()</span>); }</datetime>
XDocument rss = XDocument.Load(@"http://www.isisaka.com/blog/index.xml");   
//select句でデータ変換する   
IEnumerable query = from x in rss.Element("rss").Elements("channel").Elements("item")
                              select DateTime.Parse(x.Element("pubDate").Value);   
foreach (var d in query) {   
    Console.WriteLine(d.ToLongDateString());   
}

この例では4行のselect句の式でXMLのバリュー(string型)のデータをDateTime型に変換しているので、クエリ式の結果をIEnumerble<DateTime>型の変数に格納することができます。

条件付きクエリ

先ほどのもっとも単純なクエリ式ではソースシーケンスのデータに対し、なんのフィルタリングもかけずに値を返していましたが、実際には何らかのフィルタリング条件をつけて必要なデータだけをソースシーケンスから取り出したいことが多いと思います。

クエリ式において、このフィルタリング条件を指定するのがwhere句です。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
from <span class="hljs-comment">[範囲変数]</span> in <span class="hljs-comment">[データソース]</span>
whewe <span class="hljs-comment">[条件式]</span>
select <span class="hljs-comment">[]</span>
from <span class="hljs-comment">[範囲変数]</span> in <span class="hljs-comment">[データソース]</span> whewe <span class="hljs-comment">[条件式]</span> select <span class="hljs-comment">[式]</span>
from [範囲変数] in [データソース]
whewe [条件式]
select [式]

この例では7秒目でToListメソッドを使ってLinq式の結果をメモリ上に確定しています。

これの詳しい話についてはMSDNライブラリの「クエリの結果をメモリに格納する (C# プログラミング ガイド)」を参照してください。

それでは、また次回。

コメント

  1. OPC Diary より:

    Linq to XML 入門その1 (XML文書の作り方)

    準備 これから数回に分けてLinq to XMLの基礎的な使い方についてまとめ…

  2. […] Liunq to XML 入門 その3 (Linq クエリ構文) […]

タイトルとURLをコピーしました