2009-09-11 33 views
9

私はCategoriesの標準自己参照テーブルを持っています。私のエンティティモデルでは、私は団体をChildrenParentとしました。レイジーローディングなしでCategoryオブジェクト全体をロードすることは可能ですか?セルフリファレンステーブルを読み込みたい場合

以下のコードを使用すると、2番目のレベルにのみ読み込まれます。

db.Categories.MergeOption = System.Data.Objects.MergeOption.NoTracking; 

var query = from c in db.Categories.Include("Children") 
      where c.IsVisible == true 
      orderby c.SortOrder, c.Id 
      select c; 

すべてのカテゴリオブジェクトが既に読み込まれている場合は、参照を読み込むことはできますか?それをロードする

一つの方法は、複数回に

db.Categories.Include("Children.Children.Children.Children.Children") 

Childrenプロパティを追加することですが、これは非常に長い非常識なT-SQLコードを生成しても、それは私がやりたいことはありません。

答えて

1

いいえ、できません。すべてのLINQ to EntitiesクエリはSQLに変換されます。どのSQL文が自己参照階層に無制限の深さを含んでいますか?標準SQLには、1つもありません。これがT-SQLで拡張されている場合、私はそれが何であるかわからないし、EFプロバイダもそうは思わない。私はいくつかのエンティティを持っている場合、私は自己参照テーブル内のすべての子を取得したいことを実現するために使用されている

+1

しかし、 "SELECT * FROM Categories"というクエリを実行すると、テーブル全体がロードされ、すべての親カテゴリと子カテゴリがロードされているため、すべてが1つのテーブルに格納されています。この場合、この読み込まれたレコードを参照プロパティに割り当てることはあまり複雑ではありませんか? –

+1

実際にテーブル全体を反復した場合、すべてのオブジェクト*はメモリに格納され、*インクルードの有無にかかわらず*修正*されます。しかし、あなたがテーブルの最後のレコードに到達するまで、それは起こりません。関連するオブジェクトが反復する*最初のレコードにそこに存在することを保証します。 –

+3

"自己参照階層に無制限の深さを含むSQL文はありますか?" - > T-SQLの共通テーブル式 –

1

いいえ、Loadメソッドの使用を検討してください。

if (!category.Children.IsLoaded) 
     category.Children.Load(); 

もちろん、カテゴリエンティティはObjectContextによって追跡する必要があります。

how-does-entity-framework-work-with-recursive-hierarchies-include-seems-not-toの説明があります。

+0

私はこのメソッドを知っています(それはT-SQLクエリのhundretsを生成します)が、キャッシュに保存しているので、追跡せずにmussロードします。私は他の何かを探しています。カテゴリのテーブル全体を読み込むと、親カテゴリと子カテゴリもロードされていますが、関連プロパティはロードされません。また、CategoryTypeの関連テーブルがあり、同じ行を参照しているかどうかにかかわらず、各カテゴリのマスをロードします。 –

+0

これをキャッシュする必要はありませんでした。うーん、私はこれがどのように解決できるか考えようとします。 –

関連する問題