(Language_Integrated_Query から転送)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2025/01/14 10:27 UTC 版)
|
|
この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。 (2024年2月)
|
統合言語クエリ (Language INtegrated Query; LINQ, リンクと発音する) とは、.NET Framework 3.5において、様々な種類のデータ集合に対して標準化された方法でデータを問い合わせること(クエリ)を可能にするために、言語に統合された機能のことである。開発ツールはVisual Studio 2008から対応している。
統合言語問合せという表記も見られる[1]: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を自然に導入するための新しい言語仕様が併せて追加されている。代表的な例を以下に示す。
IEnumerableインターフェイスの拡張メソッドとして標準クエリ演算子を含むメソッド群が追加された。
C#における仕様の詳細はC# 3.0からの仕様を参照されたい。
主な標準クエリ演算子を挙げる。
Whereは、指定した述語をもとに要素のフィルタ処理を行う。高階関数のfilterに相当する。Selectは、指定した評価関数をもとに要素のプロジェクションを行う。高階関数のmapに相当する。SelectManyは、指定した評価関数をもとに1対多のプロジェクションを行う。Joinは指定したキーセレクタをもとに等価結合を行う。GroupJoinは指定したキーセレクタをもとにグループ化結合を行う。OrderBy,ThenByは指定したキーセレクタをもとに結果の順序を指定する。GroupByは指定したキーセレクタをもとにグループ化を行う。Aggregateは、指定した累積関数をもとにシーケンスの集計を行う。高階関数のfoldに相当する。
LINQはサードパーティーによるものを含め、あらゆる種類のデータソースに対して適用することができる。これは、標準クエリ演算子に対応する機能を拡張メソッドとしてデータソースに追加することで実現している。
従来では同種のデータ型やオブジェクトの集合に対して列挙やソート、フィルタを効率的に扱うために配列 (Arrayクラス) やコレクションオブジェクトが用いられた。一方、データベースやXML上のデータ集合はADO.NETによってデータセットとして取り扱われており異なる操作が必要であった。LINQによって、これらのオブジェクトやデータセットを区別せず共通的に扱うことが可能となった。
例えば、マイクロソフトによるものでは次のような実装がある。
サードパーティー製データソースとしては、以下が挙げられる。
次の言語がLINQに対応する。
C++/CLIはLINQに対応する予定はなく、従来通りの構文でLINQ関係のライブラリを使用できるのみである。
LINQは、LINQの思想に感化された人々により、マイクロソフト系のプログラミング言語にとどまらず、さまざまなプログラミング言語向けの実装が行われている。