0

かなり深いオブジェクト グラフがあり、グラフ全体を熱心に読み込みたいと考えています。

.Include() を使用して、特定のナビゲーション プロパティを積極的に読み込むことができることを認識しています。

ただし、これは壊れやすいようで (ナビゲーション プロパティを追加する場合は、追加の .Include も追加する必要があります)、(私の場合) かなりの数の .Include() ステートメントが必要です。

オブジェクト グラフ全体を積極的に読み込むように EF に指示する方法はありますか?

4

2 に答える 2

1

ロードしたいすべてのナビゲーションプロパティを手動で含める必要があります。EFは、すべてを含めるための組み込みの方法を提供していません。

ただし、これは壊れやすいようで(ナビゲーションプロパティを追加する場合は、.Includeも追加する必要があります)、(私の場合は)かなりの数の.Include()ステートメントが必要です。

オートマジックにすべてを含めるよりも壊れにくいです。このような機能は、多くの場合、ナビゲーションプロパティを予期せずロードすることを熱望するため、非常に多くの問題を引き起こします。

回避策として、エンティティタイプのEFメタデータを探索Includeし、グラフ内のすべてのナビゲーションプロパティの呼び出しを追加するカスタム拡張メソッドを作成できます。

EFでの積極的な読み込みを改善するために提案された機能がいくつかあります。それらを確認したり、価値があると思われる機能に賛成したり、新しい機能を提案したりできます。

于 2012-04-27T07:27:30.873 に答える
0

ただし、これは壊れやすいようで (ナビゲーション プロパティを追加する場合は、追加の .Include も追加する必要があります)、(私の場合) かなりの数の .Include() ステートメントが必要です。

オブジェクト グラフをロードするすべてのコードを 1 か所に保持するために、コードのどこからでも使用できる拡張メソッドを作成しました。

static public IQueryable<My> IncludeAll(this DbSet<My> parent)
{
    var include = parent
        .Include(p => p.CollA)
        .Include(p => p.CollB)
        .Include(p => p.CollC)
        .Include(p => p.CollD)
        .Include(p => p.CollE)
        .Include(p => p.CollF)
        .Include(p => p.Etc);

    return include;
}

使用法

var query = ctx.Mys.IncludeAll().Where(...);
于 2015-10-03T19:10:19.583 に答える