7

すべて、

そのため、LINQ-to-SQLのselectクエリはすべて、CompiledQueriesを使用して処理を高速化しました。これまでのところselect文ではうまく機能しますが、insert、update、またはdelete文をプリコンパイルする方法を私は理解することができませんでした。

もちろん、LINQ-to-SQLで挿入、削除、または更新するときは、オブジェクトモデルを使用する必要があります。しかし、明らかにそれがクエリを生成する途中のどこかで、それは事前にコンパイルして静的メンバに格納するのに良いでしょう。

これは可能ですか?プリコンパイルされていない場合の更新、削除、挿入に対するLINQのパフォーマンスはどのようなものですか?私はそれがselectよりはるかに速いのを見ることができました、なぜなら彼らがその下でやることはずっと単純で、あまり「動的」ではありません...

3 답변


8

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

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

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


  • クール。理にかなっています。 LINQ-to-SQLでUpdateとDeleteクエリが複雑なWHERE句を持つことは決してないことを私は忘れていたと思います。それらは常にIDに基づいて更新/削除するだけです。そしてLINQ-to-SQLへの挿入は、おそらくWHERE句をまったく持たないでしょう... - Sam Schutte

3

削除はごく簡単なので(DELETE FROM Table WHERE Key ...)、UPDATEは変更されたフィールドのみを更新するため、更新操作ごとに異なるため、3つの挿入だけがコンパイルおよび再利用ができることに意味があります。

[)amien


  • 興味深いことに - 私は、更新と削除がもっと複雑になる可能性があると私の考えの一部として考えました。標準SQLでは、確かにそれらはあり得ます - あなたはUpdateまたはDeleteの終わりに巨大な複雑なWHEREステートメントを持つことができます。しかしLINQ-to-SQLでは、主キーまたは更新された状態のみを使用します。 - Sam Schutte

0

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


  • 真 - 実行計画の観点から。 "プリコンパイル"私が話しているのは、LINQがその式ツリーからSQLに解析される部分です。 CompiledQuery.Compile()メソッドを参照してください。 - Sam Schutte

リンクされた質問


関連する質問

最近の質問