23

私は.NETの初心者ですが、linqはどのように機能するのか疑問に思っていました。これは、多くのlinqクエリを次々に適用できるためですが、情報の転送やリストへの変換に使用されるまで、実際には実行されません。など。linq
クエリを取得するには、SQLに直接whereフィルターを適用する2つの重要な方法と、IQueryable<T>すべてのレコードを取得してメモリ上で処理するIEnumerableがあります。ただし、このコードを見てみましょう。

            //Linq dynamic library
            IQueryable<Table> myResult = db.Categories
                .Where(a => a.Name.Contains(StringName))
                .OrderBy("Name")
                .Skip(0)
                .Take(10);

            if (myResult != null)
            {
                return myResult.AsEnumerable();
            } 
            else
            { return null; }

私がLinqダイナミックライブラリを使用している場合、このクエリからの直接の結果が取得されIQueryable<T>ます。クエリが最終的にとして返される場合、クエリはIEnumerable実際にSQLでフィルタリングされていますか?それともメモリにありますか?

4

2 に答える 2

38

それはまだデータベースで実行されます、心配しないでください。Where基本的に、 etcの実装が使用されるのはすべてです。IQueryable<T>拡張メソッドを介してメソッドを呼び出している間は、Queryable式ツリーを使用します。そのクエリからフェッチを開始すると、SQLに変換され、データベースに送信されます。

一方、(コンパイル時の型に関して)取得したでこれらのメソッドのいずれかを使用すると、の拡張メソッドが使用され、残りのすべての処理実行されます。処理中。IEnumerable<T>Enumerable

例として、これを考えてみましょう。

var query = db.People
              .Where(x => x.Name.StartsWith("J"))
              .AsEnumerable()
              .Where(x => x.Age > 20);

ここでは、入力シーケンスを返すAsEnumerable() だけですIEnumerable<T>が、と入力します。この場合、データベースクエリは、名前がJ-で始まる人のみを返し、代わりにクライアントで年齢フィルタリングが実行されます。

于 2013-02-12T21:32:10.727 に答える
5

を返し、IEnumerable<T>クエリをさらに絞り込むと、メモリ内でさらに絞り込みが行われます。で表現された部分はIQueryable<T>、適切なSQLステートメントに変換されます(明らかに、LINQ-to-SQLの場合)。

より長く詳細な回答については、IEnumerable<T>とIQueryable<T>を返すを参照してください。

于 2013-02-12T21:31:15.323 に答える