LINQとは何ですか?[閉まっている]


126

LINQとは何ですか?データベース用だと知っていますが、どうしますか?


20
「合理的に答えられない」という基準を破ったと思います。この質問が閉じられるべき理由はありません。
エイミーB

1
LINQの作成者であるErik Meijerの意見を聞いてください。ところで、それはデータベースだけのためではありません
Sнаđошƒаӽ

回答:


171

LINQは、Language Integrated Queryの略です。

Microsoft言語開発者は、YAQL(Yet Another Query Language)を作成する代わりに、自分の言語(C#やVisual Basicなど)で直接クエリを表現する方法を提供しました。これらのクエリを形成するための手法は、クエリ対象の実装の詳細に依存しないため、多くのターゲット(データベース、メモリ内オブジェクト、XML)に対して有効なクエリを記述できます。クエリが実行されます。

.NET Framework(3.5)に属するパーツから、この探索を始めましょう。

  • LINQ To Objects-クエリメソッドについてSystem.Linq.Enumerableを調べます。これらのtarget IEnumerable<T>を使用すると、型指定されたループ可能なコレクションをタイプセーフな方法でクエリできます。これらのクエリは、式ではなく、コンパイルされた.NETメソッドに依存しています。

  • LINQ To Anything- いくつかのクエリメソッドについてSystem.Linq.Queryableを調べます。これらのターゲットIQueryable<T>により、基礎となる実装によって変換できる式ツリーの構築が可能になります。

  • 式ツリー-System.Linq.Expressions名前空間を調べます。これはデータとしてのコードです。実際には、このことに注意する必要がありますが、実際にはこれらのタイプに対するコードを記述する必要はありません。言語機能(ラムダ式など)を使用すると、さまざまな省略形を使用して、これらの型を直接処理しないようにすることができます。

  • LINQ To SQL- System.Data.Linq名前空間を調べます。特に注意してくださいDataContext。これは、C#チームによって構築されたDataAccessテクノロジです。うまくいきます。

  • LINQ To Entities- System.Data.Objects名前空間を調べます。特に注意してくださいObjectContext。これは、ADO.NETチームによって構築されたDataAccessテクノロジです。これは、LINQ To SQLよりも複雑で強力で、使用が困難です。

  • LINQ To XML- System.Xml.Linq名前空間を調べます。基本的に、人々はの内容に満足していませんでしたSystem.Xml。したがって、Microsoftはそれを書き直し、その書き直しを利用して、XMLに対してLINQ Toオブジェクトをより簡単に使用できるようにするいくつかのメソッドを導入しました。

  • FuncActionなど、いくつかの優れたヘルパータイプ。これらのタイプは、Generic Supportのデリゲートです。独自のカスタム(および互換性のない)デリゲート型を宣言する時代は終わりました。

上記はすべて.NET Frameworkの一部であり、任意の.NET言語(VB.NET、C#、IronPython、COBOL .NETなど)から利用できます。


では、言語機能について説明します。私がC#に固執するつもりです。VB.NETにも同様の改善がいくつかありました(C#にはない2つ-XMLリテラル)。これは短く不完全なリストです。

  • 拡張メソッド-これにより、入力するメソッドを「追加」できます。メソッドは、実際には型のインスタンスを渡される静的メソッドであり、型のパブリックコントラクトに制限されていますが、制御しない型にメソッドを追加する(文字列)、または追加する(完全に実装される)場合に非常に便利です。 )インターフェイスへのヘルパーメソッド。

  • クエリ内包構文-これにより、SQLのような構造で書き込むことができます。このすべてのものは、System.Linq.QueryableまたはSystem.Linq.Enumerable(myCustomersのタイプによって異なります)のメソッドに変換されます。これは完全にオプションであり、それなしでLINQをうまく使用できます。このスタイルのクエリ宣言の利点の1つは、範囲変数のスコープが設定されていることです。これらの変数は、句ごとに再宣言する必要はありません。

    IEnumerable<string> result =
     from c in myCustomers
     where c.Name.StartsWith("B")
     select c.Name;
    
  • ラムダ式-これはメソッドを指定するための省略形です。C#コンパイラは、それぞれを匿名メソッドまたはtrueに変換しますSystem.Linq.Expressions.Expression。Linqをうまく使用するには、これらを本当に理解する必要があります。パラメータリスト、矢印、メソッド本体の3つの部分があります。

    IEnumerable<string> result = myCustomers
     .Where(c => c.Name.StartsWith("B"))
     .Select(c => c.Name);`
    
  • 匿名型-コンパイラには、型を作成するのに十分な情報がある場合があります。これらの型は真に匿名ではありません。コンパイラーは型を作るときに名前を付けます。しかし、これらの名前はコンパイル時に作成されるため、開発者が設計時にその名前を使用するには遅すぎます。

    myCustomers.Select(c => new 
    {
      Name = c.Name;
      Age = c.Age;
    })
    
  • 暗黙的な型-コンパイラーは、初期化から十分な情報を得て、型を判別できる場合があります。varキーワードを使用して、コンパイラーに指示することができます。プログラマーは匿名型の名前を使用できないため、匿名型の変数を宣言するには暗黙の型指定が必要です。

    // The compiler will determine that names is an IEnumerable<string>
    var names = myCustomers.Select(c => c.Name);
    

14

LINQ(Language INtegrated Query)は以下を参照します。

  • 高次関数を引数として広範囲に使用するコレクションおよびイテレータ操作用のライブラリ(System.Linq)

  • 単純な関数を抽象構文ツリーとして渡し、操作するためのライブラリ(System.Linq.Expressions)

  • コレクションを処理するためのよりSQLに似た構文を提供するためのさまざまな言語の構文拡張、匿名関数のよりコンパクトな表記、および構文的に最終メンバー関数と区別できない静的ヘルパー関数を導入するメカニズム

  • クエリ構造を受信して​​最適化を実行するためにデータプロバイダーが準拠する可能性のあるインターフェイス定義、または互換性のあるデータプロバイダー自体

コンポーネントは、単独で使用することも、組み合わせて使用​​することもできます。


10

簡単に言えば、LINQ(Language-Integrated Query)を使用すると、コードに直接クエリを記述できます。これらのクエリは、リレーショナルデータベースだけでなく、XMLや配列やリストなどのメモリ内のコンテナーオブジェクトに対しても実行できます。詳細については、MSDNライブラリを参照してください。http://msdn.microsoft.com/en-us/library/bb308959.aspx


これは正確で簡潔です。
SSD

6

簡単な答えを試してみます。LINQは、SQLに似ているが.NETアプリケーション内でコンパイルできるクエリ言語を使用してデータベース(または他のデータストア、XMLなど)をクエリする方法です。


1
では、LinqとSQLの違いは何でしょうか。
クレデンス2009年

これにはもっと洗練された名前があると思いますが、構造は異なります。SQLはどこから選択するか、LINQはどこから選択するかです。LINQの方がループが簡単です。LINQの方が簡単です:)そして、SQLが生成するSQLは、通常、時間の節約を考えると十分です。
jcollum 2009年

2
正直に言うと、SQL は次のように書く必要があると主張できます。From Where Select, etc.つまり、結果セットが実際に形成される方法でSQL 書く必要があります
Don Cheadle

6

LINQはLanguage Integrated Queryの略で、CLRで汎用の「クエリ」メカニズムを提供する方法です。

最も基本的なレベルでは、これはIEnumerable <T>の一連のメソッド(Select、Sum、Whereなど)で構成され、制限、予測などに使用できます。[1]

さらに少し説明すると、LINQは、式ツリーを取得してCLRの外部のデータソースに対して「ネイティブ」クエリを実行するために使用できる新しいLINQプロバイダーモデルも定義しています(例:LINQ to SQL、LINQ to XML、LINQ)。 NHibernateなどへ

C#とVB.NETでは、厳密に型指定されたクエリ(SQLに非常によく似ている)をインラインで記述できるクエリ構文も定義されています。これは、コンパイラーが同等のIEnumerable <T>呼び出しに変換します。

私にとって、LINQで最も興味深いのは、それをサポートするために必要なすべてのC#およびVB.NET機能が、それ自体で有用であることです。拡張メソッド、匿名型、ラムダ式、および暗黙の型指定はすべて、LINQをサポートするために必要でしたが、これらの機能は純粋なLINQコンテキストの外部で使用する傾向があります。

[1]これらは関係用語であり、関数型プログラマーはおそらくMap、Reduce、Foldなどを好むでしょう。


5

LINQは、C#プログラミング言語から派生したイディオムを使用してデータを抽出する技術です。これはSQLによる機能設計の多くを負っていますが、基本的には独自のデータクエリ言語です。幅広いデータソース(SQLデータベース、インメモリ表現、XMLなど)で動作します。特に、LINQ-To-SQLは、SQLプログラミングとC#/ VBプログラミングの間で「インピーダンスミスマッチ」と呼ばれることが多い、組み込みSQLの従来の使用とは対照的です。

LINQとその制限の説明については、次の関連する質問を参照することをお勧めします。LINQto SQLは要点を見逃していないのですか?


0

http://msdn.microsoft.com/en-us/netframework/aa904594.aspx

「LINQプロジェクトは、言語に統合されたクエリ、設定、変換操作を網羅する.NET Frameworkの一連の拡張のコードネームです。これは、C#とVisual Basicをクエリのネイティブ言語構文で拡張し、クラスライブラリを利用して利用します。これらの機能。」


それはデータベース用ですか?ここで(SOで)見たものは、.net環境のコレクションに似ています。
OscarRyz 2009年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.