1

ここで、エンティティ フレームワークで、contains 操作を実行するとパフォーマンスが低下することを読みました。

内容は SQL で「WHERE IN」に変換されるため、パフォーマンスが低下します」

現在、10 列のテーブルが 10 個近くあり、レコードをフェッチしている間、Contains を 8 列近く使用しています。

私の質問は本当ですか?はいの場合、それに代わるものは何ですか?

4

1 に答える 1

3

はい、Contains() はパフォーマンスを大幅に低下させます。

したがって、以下の解決策を試すことができます。

中間テーブルを追加し、Contains 句を使用する必要がある LINQ クエリからそのテーブルに結合することで、EF の含む問題を解決することができました。このアプローチにより、驚くべき結果を得ることができました。大規模な EF モデルがあり、EF クエリをプリコンパイルするときに「Contains」が許可されていないため、「Contains」句を使用するクエリのパフォーマンスが非常に低下していました。

概要:

  1. SQL Server でテーブルを作成します。たとえば、HelperForContainsOfIntType に Guid データ型の HelperID と int データ型列の ReferenceID を指定します。必要に応じて、さまざまなデータ型の ReferenceID を持つさまざまなテーブルを作成します。

  2. HelperForContainsOfIntType などの Entity / EntitySet を EF モデルに作成します。必要に応じて、異なるデータ型に対して異なる Entity / EntitySet を作成します。

  3. 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();

私はここからそれを手に入れました

于 2012-12-01T08:16:22.097 に答える