ユーザ定義関数(Linqに正しく宣言され、接続されている)がLinqクエリで使用されている場合、非常に奇妙なLinq to Entitiesの動作に気付きました。 文を実行するとします。Linq to Entities:関数を使用すると複数のクエリが発生する
var list =(コンテキスト内のtsから。テスト選択MyFunction(ts.TestId));
LinqがMyFunctionを適切に使用する正しいSQL Selectクエリを作成します。しかし、問題は:Linqは、一度送信するのではなく、テーブルのすべての行に対してこのステートメントを生成して送信します。私はSQLプロファイラを見て、このSelect文がサーバに送信された回数がTestテーブルのレコード数と正確に等しいことを発見しました... これはなんですか? Linq to Entitiesの別のバグですか?誰か回避策を知っていますか?このような振る舞いによって、データベース側の関数は実際には使用できなくなります。
もちろん、MyFunction()は、テーブルにレコードがある回数だけ実行する必要があります。これは私の心配ではありません。問題は、SQL文自体(TestからMyFunction(TestId)を選択)がSQL Serverに25回送信されたことです。 SQLプロファイラを見て、このステートメントの実行の後ろで何が起きているのかを確認すると、私が何を話しているのか理解できます。 –
@Dimitry - 明らかに私はあなたのコードもデータベースも持っていないので、単に「SQLプロファイラを見る」ことはできません。より多くのコード、特にlinqクエリを評価するコードを投稿すると役に立ちます。 –
この非常に一般的な問題を見るためにデータベースやコードは必要ありません。任意のユーザ定義関数を作成し、LinqとEntitiesを接続し、この関数を使用しているLinqクエリを実行します。今度はSQLプロファイラを見ると、予想される1つのクエリではなく、異常に大きな数のクエリを扱うことがわかります。 –