特集:VBプログラマーのためのLINQ超入門(前編)

LINQ(リンク)の基礎知識

デジタルアドバンテージ 遠藤 孝信
2008/09/26
Page1 Page2 Page3 Page4

そのほかのポイント

 クエリの書き方以外にもいくつか押さえておく点があります。

■クエリの戻り値はIEnumerable(Of T)オブジェクト

 クエリの戻り値は、クエリの最後がSelect句の場合にはIEnumerable(Of T)インターフェイスを実装したオブジェクトとなります。実際には公開されていないクラス・ライブラリ内のクラスのオブジェクトなのですが、それがどのようなクラスかについて開発者は気にする必要はなく、そのクラスがIEnumerable(Of T)インターフェイスを実装しているという点のみがポイントです。

 先ほども述べたように、IEnumerable(Of T)インターフェイスを実装しているということはFor Each文により列挙できます。つまり、クエリの結果はFor Each文で利用されることが前提となっているわけです。

■遅延実行

 もう1点、LINQを使ううえで気を付けなければならないことは、クエリの戻り値を変数に代入しただけではクエリは実行されないという点です。便宜上、ここまでクエリの戻り値(出力)を「クエリ結果」と記述していましたが、このクエリ結果には実際にはクエリの結果は格納されません。

 クエリが実行されるのは、クエリの結果がFor Each文により処理されるときなのです。これは「遅延実行(deferred execution)」と呼ばれます(「defer」は「延期する」「延ばす」という意味)。

 サンプル・プログラムで確認してみましょう。次のプログラムは1〜40の数字のうち3の倍数と3が付く数字のみを抽出するクエリを作成しています。そしてFor Each文にその結果を列挙し画面に表示します。その後、10以降の数字をすべて「1」に変更し、もう一度For Each文を実行します。それらの出力の違いから、クエリを作成した時点ではクエリは実行されていない(クエリの結果が固定的でない)ことが分かります。

Module Module1

    Sub Main()

    ' 1から40までの配列numsを作成
    Dim nums As Integer() = Enumerable.Range(1, 40).ToArray()

    ' 3の倍数と3が付く数字のみを抽出
    Dim result As IEnumerable(Of Integer) = _
      From n In nums _
      Where n Mod 3 = 0 Or n.ToString().Contains("3") _
      Select n

    For Each num As Integer In result
      Console.WriteLine(num)
    Next ' 出力: 3、6、9、12、13、15、18、21、23、24、27、30、……

    ' 「10」以降をすべて1に変更する
    For i As Integer = 10 To nums.Length - 1
      nums(i) = 1
    Next

    For Each num As Integer In result
      Console.WriteLine(num)
    Next ' 出力: 3、6、9

  End Sub

End Module
リスト7 1〜40の数字のうち3の倍数と3が付く数字のみを表示

 これは「LINQ to Object」での例ですが、「LINQ to SQL」の場合にはFor Each文を実行したときに初めてSQL文がデータベース・サーバに送信されるということが遅延実行により起こります。このため、For Each文を実行するたびにデータベースの最新のレコードを得ることができます。逆に、For Each文を実行するまでは何度でもクエリを実行できます(何度実行しても無駄なSQL文が発行されることはありません)。

 とはいっても遅延実行されると困る場合もあります。そのような場合には、クエリ結果に対してToArrayメソッドあるいはToListメソッドを呼び出せば、クエリが即時実行され、配列あるいはList(Of T)オブジェクトが作成されます。

おまけ − LINQPadの紹介

 今回の最後に、LINQ学習用のフリーのツールを紹介しておきます。「LINQPad」というツールです。ダウンロードは以下のページから行ってください。

LINQPadのページ

 このツールでは、LINQのクエリだけを簡単に実行して試すことができます。クエリ対象がデータベースであっても非常に簡単です。クエリの実行結果は見やすい表形式で表示さます。もともとC#用のツールだったようですが、現在のバージョンではVBのクエリにも対応しています。


LINQPadの実行画面

 しかもLINQPadにはクエリのサンプルも数多く組み込まれており、簡単に試していくことができます。非常によくできた学習ツールです。

 今回はLINQの基礎について解説しました。次回はもう少し掘り下げつつ、LINQ to SQLを使ったLINQについて解説していきます。End of Article


 INDEX
  VBプログラマーのためのLINQ超入門(前編)
  LINQ(リンク)の基礎知識
    1.ADO.NET+SQL文によるデータベースへの問い合わせ
    2.LINQによるデータベース/コレクションへの問い合わせ
    3.クエリの実行を支えるさまざまなLINQプロバイダ/LINQの書き方
  4.そのほかのポイント/LINQPadの紹介
 
  VBプログラマーのためのLINQ超入門(後編)
  LINQによるデータベース・アクセスとO/Rマッピング
    1.LINQのメソッド構文
    2.データベースの問い合わせを行うLINQ to SQL
    3.O/RマッピングとLINQ to SQL


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間