統合言語クエリ

統合言語クエリ (Language INtegrated Query; LINQ, リンクと発音する) とは、.NET Framework 3.5において、様々な種類のデータ集合に対して標準化された方法でデータを問い合わせること(クエリ)を可能にするために、言語に統合された機能のことである。開発ツールはVisual Studio 2008から対応している。

統合言語問合せという表記も見られる:43。

例

C#による例を示す。このコードでは、fruitsの中から"m"で始まるものを取り出し、それをretに格納し、それをforeach文で順に出力している(実際にはretは遅延評価される)。

using System;
using System.Linq; // LINQ拡張メソッドの利用に必要。メソッド構文ではなくクエリ構文を使用する場合でも必要となる。

public class Test
{
  public static void Main()
  {
    string[] fruits =
    {
      "apple",
      "cherry",
      "melon",
      "orange",
      "marron",
      "mango",
    };
    // クエリ構文
    Console.WriteLine("Query Syntax");
    {
      // fromからselectまでの一連の式がLINQクエリ式である。
      var ret = from x in fruits
                where !string.IsNullOrEmpty(x) && x[0] == 'm'
                select x;
      foreach (var e in ret)
      {
        Console.WriteLine(e);
      }
    }
    // メソッド構文
    Console.WriteLine("Method Syntax");
    {
      // オブジェクトをフィルタリングする条件(述語)を、ラムダ式で指定する。
      var ret = fruits.Where(x => !string.IsNullOrEmpty(x) && x[0] == 'm');
      foreach (var e in ret)
      {
        Console.WriteLine(e);
      }
    }
  }
}

言語仕様

LINQに対応する言語は、LINQを自然に導入するための新しい言語仕様が併せて追加されている。代表的な例を以下に示す。

クエリ式
SQLのような問い合わせ言語風の文法が取り入れられた。これはメソッド構文の構文糖となっている。
拡張メソッド
同様のデータ構造に対して後から操作を追加するために取り入れられた。例えば、LINQ to Objectの場合はIEnumerableインターフェイスの拡張メソッドとして標準クエリ演算子を含むメソッド群が追加された。
ラムダ式
従来の匿名メソッドに取って代わる構文として導入された。引数の型が省略できることや、式木に変換することができることで、自然にLINQを導入できるようにした。
匿名型
クエリの結果や途中の値を一時的な値の組合せで保持できるよう導入された。クエリ結果の格納を意図しているため、匿名型の各値は読み取り専用プロパティとなっている。

C#における仕様の詳細はC# 3.0からの仕様を参照されたい。

標準クエリ演算子

主な標準クエリ演算子を挙げる。

制限演算子

プロジェクション演算子

結合演算子

順序付け演算子

グループ化演算子

集計演算子


データソース

LINQはサードパーティーによるものを含め、あらゆる種類のデータソースに対して適用することができる。これは、標準クエリ演算子に対応する機能を拡張メソッドとしてデータソースに追加することで実現している。

従来では同種のデータ型やオブジェクトの集合に対して列挙やソート、フィルタを効率的に扱うために配列 (Arrayクラス) やコレクションオブジェクトが用いられた。一方、データベースやXML上のデータ集合はADO.NETによってデータセットとして取り扱われており異なる操作が必要であった。LINQによって、これらのオブジェクトやデータセットを区別せず共通的に扱うことが可能となった。

例えば、マイクロソフトによるものでは次のような実装がある。

サードパーティー製データソースとしては、以下が挙げられる。

LINQに対応する言語

次の言語がLINQに対応する。

C++/CLIはLINQに対応する予定はなく、従来通りの構文でLINQ関係のライブラリを使用できるのみである。

その他の言語での実装

LINQは、LINQの思想に感化された人々により、マイクロソフト系のプログラミング言語にとどまらず、さまざまなプログラミング言語向けの実装が行われている。

注釈

  1. ↑
  2. ↑ JSINQ - LINQ to Objects for JavaScript - CodePlex Archive
  3. ↑ linq.js - LINQ for JavaScript - CodePlex Archive
  4. ↑ LINQ to JavaScript - CodePlex Archive
  5. ↑ PHPLinq - LINQ for PHP - Language Integrated Query - CodePlex Archive
  6. ↑
  7. ↑
  8. ↑ JaQu
  9. ↑
  10. ↑ GitHub - heynemann/pynq: Python implementation of Microsoft's .Net Language Integrated Query (LINQ)
  11. ↑

出典

  1. ↑ Oracle 2017.

参考文献

外部リンク