階層データでエンティティフレームワークを使用するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/812046

質問

SQLサーバーの大規模な階層データセットを使用しています。標準の「EntityID、ParentID」を使用してモデル化しています。アプローチの種類。ツリー全体に約25,000のノードがあります。

ツリーのサブツリーにアクセスし、サブツリーのノードからぶら下がっている関連データにアクセスする必要があることがよくあります。数年前、テーブル値関数に基づいてデータアクセスレイヤーを構築しました。サブツリーのルートノードを指定して、再帰クエリを使用して任意のサブツリーをフェッチしました。

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

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

明確化:ツリー内の25,000ノードによって、オブジェクトまたはEntity Frameworkに関係するものではなく、階層データセットのサイズを参照しています。

役に立ちましたか?

解決

「ネストされたセット」というパターンを使用すると、1つのクエリ内で任意のサブツリーを取得できます。これは、ノードがあまり頻繁に操作されない場合に特に便利です。

他のヒント

Entity Frameworkを使用するとすべてが可能になりますが、ハッキングしてそこに進む必要があります。現在作業中のデータベースには、「ホルダーテーブル」が多すぎます。たとえば、ポイントはチームとユーザーの両方で共有されるためです。ユーザーとチームの両方がブログを持つこともできます。

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

これらの提案に感謝します。

答えは、Georgが示唆するネストされたセットの線に沿って、またはたぶん私が遭遇した推移的なクロージャーテーブルに沿って、データベース内のデータを再構築することであることに気付き始めています。

そのようにして、2つの重要なメリットを期待しています:

a)任意のサブツリーに対する高速クエリ

b)再帰クエリを必要としないデータモデル-おそらく、Entity Frameworkに簡単にアクセスできるようになります!

難しい問題に対する正しい答えが、答えることではなく、何か他のことをすることであることがどれほど頻繁にあるかは、常に驚くべきことです!

scroll top