3

IQueryable 私の理解では、LINQ to SQL&Objectでは、クエリを実行するまで、さらに式を追加できます。

この例では、Query2を実行しようとすると、query1とQuery2が最終クエリになります。私は正しいですか?または、「Numbers」がDBだった場合、私は正しいですか?

    int[] Numbers= new int[] { 1, 2, 3, 4 };
    IQueryable<int> Query1 = from X in Numbers.AsQueryable()
                             where X > 1
                             select X;
    IQueryable<int> Query2 = from X in Query1
                             where X > 2
                             select X;
    //if I do this: Query2.Count() -> before it executes this, those two queries become one query (FinalQuery)?
    IQueryable<int> FinalQuery = from X in Query2
                                 where X > 2
                                 select X;

しかし、IEnumerableを使用する場合、Query1を実行してIEnumerableを取得しますか。次に、Query2を実行して、最終的なIEnumerableを取得しますか?; 2つのクエリを実行しますか?

4

2 に答える 2

1

結果を実際に使用しようとするまで、IEnumerableもIQueryableLINQクエリも実行されません。これらは両方とも、同じ名前の拡張メソッドを含む単なるクラスです。しかし、実際の結果ではなく、新しいクエリを返すという点で、どちらも「怠惰」です。

一般的な違いは、IEnumerableがクエリの基になるストレージとしてFuncs(基本的にデリゲート)を使用しているのに対し、IQueryableは式ツリーを使用していることです(たとえば、クエリをSQLに「変換」できます)。

于 2012-10-09T12:50:18.057 に答える
1

IEnumerableを使用する場合、Query1を実行してIEnumerableを取得しますか。次に、Query2を実行して、最終的なIEnumerableを取得しますか?

はい。ただし、これらはタンデムで実行され、各数値Xは両方のクエリを「フロー」します。これは、「遅延評価」または「遅延実行」と呼ばれます。

2つのクエリを実行しますか?

はい。時間の重複。

[IQueryableを使用]これを実行する前に、これら2つのクエリは1つのクエリ(FinalQuery)になりますか?

いいえ。

IQueryable<>とまったく同じことが起こりIEnumerable<>ます。最適化する「スマート」コンポーネントは含まれていませんwhere X > 1

于 2012-10-09T14:17:18.920 に答える