7

全て、

そのため、LINQ-to-SQL のすべての選択クエリを CompiledQueries を使用して高速化するように変換しました。これまでのところ、select ステートメントに対してはうまく機能しますが、insert、update、または delete ステートメントをプリコンパイルする方法を理解できませんでした。

確かに、LINQ-to-SQL で挿入、削除、または更新を行う場合は、オブジェクト モデルを使用する必要があります。しかし、明らかに、クエリを生成する途中のどこかで、事前にコンパイルして静的メンバーに格納すると便利です。

これは可能ですか?プリコンパイルされていない場合、更新、削除、および挿入に対する LINQ のパフォーマンスはどのようなものですか? 選択よりもはるかに高速であることがわかりました。なぜなら、それらが下で行うことははるかに単純で「動的」ではないからです...

4

3 に答える 3

8

大きな違いがあります。Linq-To-SQL 選択クエリは、大規模で複雑な式ツリーになる場合があります。これらは、「コンパイル」に時間がかかる場合があります。この場合、SQL Server に対して実行できる T-SQL に結合します。したがって、再利用できるように操作の結果をキャッシュすることは理にかなっています。

ただし、他の削除、更新、および挿入は、式ツリーを T-SQL に変換する必要のない単純な操作です (LINQ 自体はすべてクエリに関するものです)。残念なことに、これらの他の操作を実行する SQL コードを「クエリ」と考えるように訓練されているため、実際に情報を求めているわけではありません。

これらの操作は、LINQ ではなく DataContext によってのみ定義されるため、これらの機能を実行するコードは既にコンパイルされています。

于 2008-12-09T21:46:17.587 に答える
3

削除は簡単で(DELETE FROM Table WHERE Key ...)、UPDATEは変更されたフィールドのみを更新するため、更新操作ごとに異なるため、3つの挿入のみがコンパイルして再利用できるのは理にかなっていると思います。

[)アミアン

于 2008-12-10T06:03:29.923 に答える
0

L2S は「sp_executeSQL」を使用するため、最初に実行した後、ストアド プロシージャ実行プラン キャッシュに格納されます。後続の実行 (同じクエリ - 同じパラメーターではない) では、コンパイルされたプランがキャッシュから再利用されます。したがって、あなたが求めていることは、SQL Server の「舞台裏」によって自動的に処理されます。

于 2008-12-10T11:43:48.130 に答える