2

私は興味があります.Linq2SqlはIQueryableを返すコンパイル済みクエリをどのように処理しますか.

「GetEntitiesCompiled().Count()」や「GetEntitiesCompiled().Take(x)」などのコンパイル済みクエリに基づいて拡張メソッドを呼び出す場合。Linq2Sql はバックグラウンドで何をしますか? これは非常にまずいので、この状況では「CountEntitiesCompiled」のようなコンパイル済みクエリを作成する必要があります。

結果 (この場合は "GetEntitiesCompiled()") をメモリ ("ToList()" などのエンティティ クラスにマップ) にロードしますか?

したがって、コンパイルされたクエリが IQueryable を返す場合、そのクエリは Sql-Server へのリクエストの前に変更できないという意味があります。したがって、私の意見では、リストを返すこともできます。

答えてくれてありがとう!

4

2 に答える 2

0

そのような場合、Linq2Sql は十分にスマートではありません。私の経験から、それは常にコンパイルされた部分をそのまま実行します。その場合、GetEntitiesCompiled().Count()すべてのレコードをフェッチしてから in-memory を実行しますCount()

于 2011-09-16T14:13:46.000 に答える
0

私が理解しているように-事前にコンパイルされたクエリを正確に使用できない場合(さらに作成したため)、通常の クエリと同じように実行するだけですIQueryable-したがって、実際にはまだ発行されますSELECT COUNT(1) FROM ...(反復するべきではありませんテーブル全体/何でも)。

しかし、本当の答えは次のとおりです。フックして TSQL を表示できます.Log。たとえば、次のようになります。

myDataContext.Log = Console.Out; // write TSQL to the console

または単に SQL トレースを使用して、ネットワークの上下の様子を確認します。

于 2010-04-26T11:32:33.123 に答える