2010-12-14 16 views
0

ユーザ定義関数(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の別のバグですか?誰か回避策を知っていますか?このような振る舞いによって、データベース側の関数は実際には使用できなくなります。

答えて

0

これはLINQクエリに書かれているとおりです。テストテーブルの各行に対してMyFunction(ts.TestId)の結果を選択します。 テーブルに25個の行がある場合、結果セットには25個のレコードが含まれ、それぞれがMyFunctionを実行して取得されます。

実際に何をしたいですか? MyFunctionを1回だけ実行しますか?もしそうなら、あなたは25のレコードを持っていればどのTestIdを渡したいですか?

+0

もちろん、MyFunction()は、テーブルにレコードがある回数だけ実行する必要があります。これは私の心配ではありません。問題は、SQL文自体(TestからMyFunction(TestId)を選択)がSQL Serverに25回送信されたことです。 SQLプロファイラを見て、このステートメントの実行の後ろで何が起きているのかを確認すると、私が何を話しているのか理解できます。 –

+0

@Dimitry - 明らかに私はあなたのコードもデータベースも持っていないので、単に「SQLプロファイラを見る」ことはできません。より多くのコード、特にlinqクエリを評価するコードを投稿すると役に立ちます。 –

+0

この非常に一般的な問題を見るためにデータベースやコードは必要ありません。任意のユーザ定義関数を作成し、LinqとEntitiesを接続し、この関数を使用しているLinqクエリを実行します。今度はSQLプロファイラを見ると、予想される1つのクエリではなく、異常に大きな数のクエリを扱うことがわかります。 –

0

問題は解決しました。 SQLプロファイラが誤って複数のステートメントを報告していたことが判明しました。 Linqは実際には1つのステートメントしか送信しません。

関連する問題