10

私は、SQL Serverで標準的な "EntityID、ParentID"というアプローチを使ってモデル化された、大きな階層データセットを扱っています。ツリー全体には約25,000のノードがあります。エンティティフレームワークを階層データで使用するにはどうすればよいですか?

私はしばしば、ツリーのサブツリーにアクセスし、サブツリーのノードからハングする関連データにアクセスする必要があります。私は、サブツリーのルートノードを与えられた任意のサブツリーをフェッチするために再帰クエリを使用して、テーブル値関数に基づいて数年前にデータアクセスレイヤーを構築しました。

私はEntity Frameworkを使用することを考えていますが、 のような階層データをどのようにクエリするのか分かりません。 AFAIK Linqでは再帰的なクエリはありません。エンティティデータモデルでTVFを公開することはできません。

ストアドプロシージャを使用する唯一のソリューションはありますか?他の誰かがこれを解決しましたか?

説明:ツリー内の25,000ノード階層化されたデータセットのサイズを指しています。オブジェクトまたはEntity Frameworkとは関係ありません。

答えて

6

「ネストセット」というパターンを使用すると、1つのクエリ内で任意のサブツリーを取得することができます。これは、ノードが非常に頻繁に操作されない場合に特に役に立ちます。Managing hierarchical data in MySQL

エンティティフレームワークは、完璧な世界では、このデータパターンを使用してデータを保存およびクエリする可能性を提供します。

+0

リンクは残念ながら今死んでいます – Oskar

+0

@Oskar:このページは著者のサイトで利用できるようになりました。リンクを更新しました。 –

0

Entity Frameworkではすべてが可能ですが、ハックしてスラッシュする必要があります。私が現在取り組んでいるデータベースには、ポイントがインスタンスとチームの両方と共有されているので、「ホルダーテーブル」が多すぎます。ユーザーとチームの両方がブログを持つこともできます。

25,000ノードと言うと、ナビゲーションプロパティを意味しますか?もしそうなら、データアクセスを適切に行うことは難しいかもしれません。エンティティ・フレームワークを使ってナビゲート、検索などをするのは難しくありませんが、私はペーパー・モデルを作成し、エンティティ・フレームワークを使用しながらナビゲートする方法に基づいてデータベースを作成します。あなたはそのような選択肢がないように思えます。

+0

ありがとうございました。私のシナリオでは、階層(ツリー)は、各行がノードとその親ノードIDに関するデータを保持する単なるテーブルでモデル化されています。 – jamesfm

0

これらのご提案ありがとうございます。

答えは、ゲオルグが提案するネストされたセットの線に沿って、または私がちょうど出会った過渡的なクロージャーテーブルのどちらかで、データベースのデータを改造することです。 - ので、おそらく簡単以内にそれをもたらす任意のサブツリー

b)のデータモデルaginst

a)の高速化照会もはや再帰的な問い合わせを必要とします。

そのように、私は2つの重要な利点を得ることを望みましたエンティティフレームワークの範囲!

難しい問題に対する正しい答えは、それに答えるのではなく、代わりに何か他のことをすることです。

関連する問題