2012-04-26 10 views
0

かなり深いオブジェクトグラフがあり、グラフ全体を熱心に読み込みたいと思います。EFコードを使ってオブジェクトグラフを手軽に読み込みます。

.Include()を使用して特定のナビゲーションプロパティを読み込めることがわかっています。

しかし、ナビゲーションプロパティを追加すると、さらに.Includeを追加する必要があり、かなりの数の.Include()ステートメントが必要になります。

EFにオブジェクトグラフ全体を熱心に読み込ませる方法はありますか?

答えて

1

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

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

すべての自動化されたものよりも脆弱ではありません。このような機能は、多くの場合、予期せずナビゲーション・プロパティをロードすることを熱望するため、問題が多すぎることになります。

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

EFで熱心な負荷を改善するためにseveral proposed featuresがあります。あなたは、あなたが価値のあるものを見せたり、新しいものを提案したりすることができます。

+0

これはオブジェクトグラフ全体をロードする最良の方法ですか?一日の光に見られるこれらの提案された機能はありますか? –

0

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

一箇所にオブジェクトグラフをロードするコードのすべてを保つために、私は、コード

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(...); 
のどこからでも使用することができる拡張メソッドを作成
関連する問題