0

データベースに 1 対 1 の関係があり、.Include()EF を使用すると、実行に時間がかかる恐ろしいクエリが生成されます (複数の結合)。だから私は考えました-それらのエンティティをロードするための独自のクエリを作成します。私が試したこと:

  • ExecuteStoreQuery を使用してみましたが、複雑なプロパティを具体化できないため、時間の無駄でした
  • ESQL でオブジェクト クエリを使用しようとしましたが、そこに結合を追加しても、関連するプロパティが読み込まれません。そして (明らかに) を追加すると.Include()、EF は同じ恐ろしいクエリを生成します。

問題は、EF が生成する SQL クエリをバイパスしてエンティティを具体化する方法があるかどうかです..

更新: EF クエリの単なる例です。

コード:

var query = ctx.EntitySet
               .Include("RelatedProperty")
               .Where("it.SomeFilter=@param", new ObjectParameter(...));
var sql = query.ToTraceString();

そして、次のSQLが生成されます(クエリを編集して読みやすくしました):

SELECT
    [Extent1].[SomeField] AS [SomeField],
    /* All remaining Extent1 fields */

    [Join1].[Id1] AS [Id1],
    /* All remaining Join1 fields */

    [Join3].[Id2] AS [Id2]
FROM   [OrderSet] AS [Extent1]
LEFT OUTER JOIN  (
    SELECT
        [Extent2].[SomeField] AS [SomeField],
        /* All remaining Extent2 fields */

        [Extent3].[SomeField] AS [SomeField],
        /* All remaining Extent3 fields */

    FROM  [CustomerSet] AS [Extent2]
    LEFT OUTER JOIN [OrderSet] AS [Extent3] 
        ON [Extent2].[Id] = [Extent3].[Customer_Id] ) AS [Join1] 
        ON [Extent1].[Customer_Id] = [Join1].[Id1]
LEFT OUTER JOIN  (
    SELECT 
        [Extent4].[SomeField] AS [SomeField],
        /* All remaining Extent2 fields */

        [Extent5].[SomeField] AS [SomeField],
        /* All remaining Extent3 fields */

    FROM  [CustomerSet] AS [Extent4]
    LEFT OUTER JOIN [OrderSet] AS [Extent5] 
        ON [Extent4].[Id] = [Extent5].[Customer_Id] ) AS [Join3] 
        ON [Extent1].[Customer_Id] = [Join3].[Id4]
WHERE [Extent1].[SomeFilter] = 'blah'
4

1 に答える 1

1

EF が生成する SQL クエリをバイパスしてエンティティを具体化する方法はありますか?

ほとんどの場合、いいえ:

  • ExceuteStoreQueryリレーションを読み込めません
  • ESQL は、使用せずにリレーションをロードできませんInclude

実際のオプションは次のとおりです。

  • 2 つの別個のクエリを使用します。1 つはプリンシパル エンティティ用で、もう 1 つは依存エンティティ用です (whereプリンシパル エンティティから正しい句を作成できます)。すべてが正しく構成されていて、遅延読み込みをオフにしている場合、EF は関連するエンティティを読み込むときに関係を自動的に修正します
  • .NET 4.5 を使用し、手書きの SQL/ストアド プロシージャをマップして、2 つの結果セット (プリンシパル エンティティ用と関連エンティティ用) を返します。これには、EDMX ファイルの手動変更 (および手動メンテナンス) が必要です。
于 2012-08-17T06:53:18.400 に答える