次のようなテーブルが与えられた場合
CREATE TABLE [dbo].[Article](
[Id] [int] NOT NULL,
[CategoryId] [int] NOT NULL,
[Text] [nchar](10) NOT NULL)
ユーザーは、データを表示するカテゴリを 1 つ以上選択できます。通常、1 ~ 20 のカテゴリを選択します。それに対応するために、次のようなパラメーター化されたクエリを生成します。
SELECT * FROM Article
WHERE CategoryId IN (@c1, @c2, @c3, @c4, @c5)
ただし、ごくまれに、ユーザーが何百ものカテゴリを正当に選択できる場合があります。これにより、Linq-to-Entities の制限を発見し、カテゴリ コードの範囲を形成することで回避しました。残念ながら、SQL Server に渡すことができるクエリのサイズには制限があるため、これは問題を後押しするだけです。
ハード制限を回避するために、このクエリをリファクタリングしたいと思います。私が最初に考えたのは、要求されたカテゴリを含む一時テーブルを作成し、IN(...)
句の代わりにその一時テーブルに対して内部結合を実行することでした。ただし、一時テーブルが非常に遅くなる可能性があることは理解しています。
この問題に対して、よりエレガントでパフォーマンスの高いソリューションはありますか?