Entity Frameworkは再帰的階層でどのように機能しますか? Include()はうまく動作しないようです

c# entity-framework visual-studio-2008

質問

私はItemを持っています。 ItemにはCategoryます。

CategoryIDNameParentChildrenます。 ParentChildrenCategoryです。

特定のItemに対してLINQ to Entitiesクエリを実行すると、 Include("Category")メソッドを使用しない限り、関連するCategoryは返されません。しかし、それはその親と子と共に、完全なカテゴリーをもたらさない。 Include("Category.Parent")実行することもできInclude("Category.Parent")が、このオブジェクトはツリーのようなものです。再帰的な階層があり、どこで終わるかわかりません。

どのようにしてEFに、親と子を含むCategory 、親と子を含む親などを完全にロードさせることができますか。

これはアプリケーション全体には当てはまりません。パフォーマンス上の理由から、この特定のエンティティであるCategoryにのみ必要です。

受け入れられた回答

Includeメソッドを使う代わりにLoad使うことができます。

次に、for eachを実行し、すべての子をループして、子をロードします。その後、子供たちを通してそれぞれのためにやる。

下がるレベルの数は、持っている各ループの数でハードコードされます。

これがLoadの使用例ですLoad : //msdn.microsoft.com/en-us/library/bb896249.aspx


人気のある回答

階層全体を確実にロードしたいのであれば、それが私の仕事であるストアドプロシージャを作成してみてください。階層内のすべての項目を返し、最初に要求したもの(およびその後の子)を返します。

そして、EFの関係を修正して、それらすべてが確実に接続されるようにします。

すなわちのようなもの:

// the GetCategoryAndHierarchyById method is an enum
Category c = ctx.GetCategoryAndHierarchyById(1).ToList().First();

ストアドプロシージャを正しく作成した場合は、階層内のすべての項目( ToList() )をToList()すると、EFリレーションシップのToList()になります。

そして、あなたが欲しいアイテム(First())は、そのすべての子をロードし、それらの子をロードする必要があります。すべてその1つのストアドプロシージャ呼び出しから生成されるので、MARSの問題もありません。

お役に立てれば

アレックス



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ