ここで、エンティティ フレームワークで、contains 操作を実行するとパフォーマンスが低下することを読みました。
内容は SQL で「WHERE IN」に変換されるため、パフォーマンスが低下します」
現在、10 列のテーブルが 10 個近くあり、レコードをフェッチしている間、Contains を 8 列近く使用しています。
私の質問は本当ですか?はいの場合、それに代わるものは何ですか?
ここで、エンティティ フレームワークで、contains 操作を実行するとパフォーマンスが低下することを読みました。
内容は SQL で「WHERE IN」に変換されるため、パフォーマンスが低下します」
現在、10 列のテーブルが 10 個近くあり、レコードをフェッチしている間、Contains を 8 列近く使用しています。
私の質問は本当ですか?はいの場合、それに代わるものは何ですか?
はい、Contains() はパフォーマンスを大幅に低下させます。
したがって、以下の解決策を試すことができます。
中間テーブルを追加し、Contains 句を使用する必要がある LINQ クエリからそのテーブルに結合することで、EF の含む問題を解決することができました。このアプローチにより、驚くべき結果を得ることができました。大規模な EF モデルがあり、EF クエリをプリコンパイルするときに「Contains」が許可されていないため、「Contains」句を使用するクエリのパフォーマンスが非常に低下していました。
概要:
SQL Server でテーブルを作成します。たとえば、HelperForContainsOfIntType に Guid データ型の HelperID と int データ型列の ReferenceID を指定します。必要に応じて、さまざまなデータ型の ReferenceID を持つさまざまなテーブルを作成します。
HelperForContainsOfIntType などの Entity / EntitySet を EF モデルに作成します。必要に応じて、異なるデータ型に対して異なる Entity / EntitySet を作成します。
IEnumerable の入力を受け取り、Guid を返すヘルパー メソッドを .NET コードで作成します。このメソッドは新しい Guid を生成し、生成された Guid と共に IEnumerable からの値を HelperForContainsOfIntType に挿入します。次に、メソッドは、この新しく生成された Guid を呼び出し元に返します。HelperForContainsOfIntType テーブルにすばやく挿入するには、値のリストを入力して挿入を行うストアド プロシージャを作成します。「 SQL Server 2008 (ADO.NET) のテーブル値パラメーター」を参照してください。さまざまなデータ型に対してさまざまなヘルパーを作成するか、さまざまなデータ型を処理する汎用ヘルパー メソッドを作成します。
以下のような EF コンパイル済みクエリを作成します。
static Func<MyEntities, Guid, IEnumerable<Customer>> _selectCustomers =
CompiledQuery.Compile(
(MyEntities db, Guid containsHelperID) =>
from cust in db.Customers
join x in db.HelperForContainsOfIntType on cust.CustomerID equals x.ReferenceID where x.HelperID == containsHelperID
select cust
);
Contains 句で使用する値を使用してヘルパー メソッドを呼び出し、クエリで使用する Guid を取得します。例えば:
var containsHelperID = dbHelper.InsertIntoHelperForContainsOfIntType(new int[] { 1, 2, 3 });
var result = _selectCustomers(_dbContext, containsHelperID).ToList();