LINQ クエリを最適化する良い方法があるかどうか疑問に思っています。次のような LINQ クエリを使用して、データベースからデータを取得しています。
// PKs is a list of integers
var import = context.table.Where(x => PKs.Contains(x.PrimaryKey)).AsEnumerable();
これにより、次のような SQL 呼び出しが発生すると (誤って) 想定しました。
SELECT * from table where PrimaryKey in (PK[1], PK[2], ...)
つまり、1 つのデータベース ヒット。Glimpseを使用して SQL 呼び出しを調べると、LINQ クエリが多くの個別の SQL 呼び出しに変換されていることがわかりました。
SELECT * from table where PrimaryKey=PK[1]
SELECT * from table where PrimaryKey=PK[2]
...
個々のクエリは非常に高速に実行されていましたが、整数のリストが大きい (数千単位) ため、オーバーヘッドによるオフセットにより、クエリの実行に約 25 秒かかりました。
データベース呼び出しで時間のかかる LINQ クエリを取り除き、ストアド プロシージャ呼び出しを介してデータをインポートすることにしました。
var import = this.p_import(parameter).ToList();
これにより、データベース呼び出しが 1 回だけだったため、応答時間が約 25 秒から 1 秒未満に劇的に改善されました。
これで問題は解決しましたが、LINQ を使用していたすべての理由は、ストアド プロシージャの使用を避けるためでした。LINQ クエリを最適化するより良い方法はありますか?