LINQは多くのことです、それは多くの小さなものの組み合わせです。
この答えは情報のごちゃごちゃになるでしょう、私はお詫び申し上げます。あなたの最善の策は少し待って、他の誰かがそれをよりよく要約しているかどうかを確認し、そして私が使用するキーワードについてグーグルをすることです。
LINQを意味する "ザ・怒りに統合されたQそして最も単純な解釈は、C#プログラミング言語にSQLのような構文を追加したことです。
だから代わりに:
IEnumerable<int> values = otherValues.Where(i => i > 5);
それらは以下の構文を持ちます。
IEnumerable<int> values = from i in otherValues
where i > 5
select i;
C#コンパイラは実際には上の2番目のコードを最初のコードに変換します。したがって、実際には、コレクションのメソッドを呼び出しているだけです。
しかし、これはパズルのもう一つの部分です。これらのメソッドは、実際にはコレクション内でまったく定義されていません。これらは拡張メソッドとして定義されています。つまり、基本的に「プログラマーにこれらのメソッドをコレクション型で定義されているかのように使用させ、コンパイル時にコードを修正する」というトリックがあります。 "
それで、上のコードの最初の部分:
IEnumerable<int> values = otherValues.Where(i => i > 5);
実際には次のようにコンパイルされてしまいます。
IEnumerable<int> values = Enumerable.Where(otherValues, i => i > 5);
Whereメソッドが定義されているここ:Enumerable.Where。
次の魔法は、C#コンパイラがEnumerableを使用しないことです。ここで私が答えたコードの2番目の部分のようにコードをオンザフライで書き換えて、通常の型推論を機能させることができます。それは出ます。言い換えれば、それはあなたが実際に2番目のコードを書いたふりをして、それから「otherValues」がList<T>
どこでT
ですint
それからそれを見つけるEnumerable.Where
呼び出すものです。
つまり、コレクション以外の型では、実際にWhereを独自に実装することができ、LINQ構文は賢明ではありません。
これは、実際にはインメモリコレクションではないことをクエリできることを意味します。たとえば、上記の「otherValues」がデータベースからデータを取得する方法を知っているものである場合は、Enumerable.Whereのメソッドではなく、異なるWhereメソッドが呼び出されます。
これにより、他の実装は独自の方法で、たとえばSQLを記述して実行し、結果をパッケージ化することで独自の方法で実行できるようになります。で始まります。
次の魔法は表現です。上記のWhereメソッドのパラメータi => i > 5
これは、ほとんどの場合、ラムダ式または匿名メソッドであり、実際にはインメモリコレクションに対して次のように宣言できます。
Func<int, bool> w = delegate(int i) { return i > 5; };
IEnumerable<int> values = otherValues.Where(w);
ただし、C#での式のサポートは、次のように宣言できることを意味します。
Expression<Func<int, bool>> w = i => i > 5;
ここでは、コンパイラは実際にはコンパイルされたコードとして格納するのではなく、引数を1つ取り、5と比較して大なり比較で結果を返すことを知っているメモリ内データ構造です。デリゲートとしてではなく、ラムダの書き方を使用する必要があることに注意してください。
この知識によって、式を取ることが宣言されている場合、他のWhere実装は、 "where句"を把握するだけでなく、それを調べて分解して書き直すことができます。
つまり、そのSQLの生成は、SQLコードの処理方法を知っているWhereメソッドで実行できます。
これが、WhereメソッドのLINQ to SQL宣言です。問い合わせ可能な場所。
つまりLINQは、C#コンパイラに追加された多数の小さなテクノロジの組み合わせです。
MSDNはLINQを紹介する上で非常に良い仕事をしています。
[...]
.NET言語統合クエリの定義 一連の汎用規格 走査を許可するクエリ演算子 フィルタ処理と投影操作 直接表現される .NETベースの宣言的方法 プログラミング言語標準 クエリ演算子は、クエリを IEnumerableベースに適用 情報源。 LINQは3番目を許可します 一連の標準を強化する当事者 newを使った問い合わせ演算子 ドメイン固有の演算子 ターゲットドメインに適している 技術。さらに重要なことに、3番目 当事者も自由に置き換えることができます 標準クエリ演算子 提供する独自の実装 リモートなどの追加サービス 評価、クエリの翻訳、 最適化など付着することによって LINQの規約へ パターン、そのような実装は楽しむ 同じ言語統合とツール 標準クエリとしてのサポート 演算子。
[...]
それはいくつかの異なることです。
Linqは、System.Linq名前空間は、コレクション内でコレクションを直接クエリできるようにする一連の拡張メソッドです。これは "Language INtegrated Query"の頭字語です。
また、Linq to SQLを使用したSQL、Linq to XMLを使用したXMLなど、さまざまなデータソースにクエリを実行できる一連のプロバイダもあります。
SQLのような構文を使用してオブジェクトを照会すると考えてください。 これはからコピーされた例です。http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx
public void Linq1()
{
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var lowNums =
from n in numbers
where n < 5
select n;
Console.WriteLine("Numbers < 5:");
foreach (var x in lowNums)
{
Console.WriteLine(x);
}
}
LinqはIEnumerableの拡張メソッドのセットです。それはあなたがコレクションからオブジェクトを取り出すことの詳細のいくつかを抽象化させるためのものです。あなたがLinqを通してあなたのコレクションを '照会'するとき、あなたはそれを次のような方法で行います宣言的の代わりに必須の。それが意味することは、あなたがそれを得るつもりである方法の代わりにあなたのLinqクエリがあなたが得たいものを示しているということです。 foreach()ループでは、結果をどのようにフィルター処理、グループ化、およびソートするかについて、明示的に説明する必要があります。 Linqに関しては、それはほんのいくつかの短いステートメントであり、実装の詳細はあなたから離れて抽象化されています。
多くの人が、LinqとSqlの関係でSQLと関係があると誤解していますが、それは実際にはLinqのほんの一部に過ぎません。 Linqの能力をフルに引き出すためにL2Sを使用する必要はありません。実際、多くの人はそうではありません。私の個人的な意見では、Linq-to-SQLは、SQL ServerをDBとして使用している.NETショップであれば非常に重要です。
LINQ
グーグルで? - Winston Smith