1

データ範囲で計算を行う必要がある小さなプログラムがあります。範囲には、約 50 万件のレコードが含まれている可能性があります。私は自分のデータベースを見て、agroup byが実行されたことを見ました。

結果は最初の行で実行されたと思い、後で RAM 内のデータを操作しました。しかし、今では、クエリ ビルダーが式を結合していると思います。

var Test = db.Test.Where(x => x > Date.Now.AddDays(-7));
var Test2 = (from p in Test 
             group p by p.CustomerId into g 
             select new { UniqueCount = g.Count() } ); 

私の実際のアプリでは、最初のクエリで選択された範囲に基づくサブクエリをさらに取得しました。DBが異なる選択を行えるようにするために、大きなオーバーヘッドを追加しただけだと思います。

.ToList()今、私は基本的に最初の式の後に呼び出すだけです。

だから私の質問は、式ツリーを構築するときに、クエリビルダーが異なる IQueryable を組み合わせるというのは正しいですか?

4

1 に答える 1

4

はい。それで合っています。.ToList()LINQ 式は、(たとえばを介して) 評価した時点で遅延評価されます。その時点で、Entity Framework はクエリ全体を調べ、それを表す SQL ステートメントを作成します。

この特定のケースでは、SQL データベースはグループ化やカウントなどのセットベースの操作を実行するために最適化されているため、最初のクエリを評価しない方がおそらく賢明です。データベースにすべてのTestオブジェクトをネットワーク経由で強制的に送信させ、結果をメモリ内オブジェクトに逆シリアル化し、グループ化とカウントをローカルで実行するよりも、SQL データベースが結果のカウントを返すようにすることで、パフォーマンスが向上する可能性があります。

于 2012-10-02T18:47:07.353 に答える