2017-05-14 4 views
0

「Folder」エンティティの構造を持っています。各フォルダには親フォルダへの参照があり、標準的なツリー構造が可能です。各フォルダにアイテムのコレクションを持たせることもできます。記事にはタイトルと本文があります。ルートフォルダのIDを指定すると、すべてのサブフォルダとその記事を取得する必要があります。しかし、私は記事のタイトルではなく、本文を取得したいと思っています。私は、ツリービューでフォルダ構造を表示するつもりで、ユーザーがツリービューで記事を選択した場合にのみ、完全な記事を取得したいと考えています。Entity Frameworkで階層的にデータを取得します

私はそうのような関係を設定している:私は把握することはできませんどのような

public class Folder: EntityBase 
{ 
    public string Name { get; set; } 

    public Guid ParentId { get; set; } 

    [ForeignKey(nameof(ParentId))] 
    public Folder Parent { get; set; } 

    public ICollection<Folder> Folders { get; set; } 

    public ICollection<Article> Articles { get; set; } 
} 

public class Article : EntityBase 
{ 
    public Guid FolderId { get; set; } 

    [ForeignKey(nameof(FolderId))] 
    public Folder Folder { get; set; } 

    // this needs to appear in the list 
    public string Title { get; set; } 

    // potentially large amount of data, retrieve only as necessary 
    public string Body { get; set; } 

    ... 
} 

は、再帰的にその上のすべてのサブフォルダとそのサブフォルダと通過するエンティティフレームワークを伝える方法です。自分のコードで再帰を実装する必要がありますか?それはちょっと非効率なようです。これを処理する方法がありますか? また、記事全体のタイトルフィールドだけを取得するにはどうすればよいですか?

+0

LINQ +再帰...もう一度。 –

+0

あなたはそのコメントを詳しく説明できますか?私はその意図について確信しています。 – Shaggydog

+0

ちょっとわずらわしかったので、私はLINQと再帰に関する質問に何度も尋ねられたと言っていました。冷笑のビットが私のより良いを得るために申し訳ありません。魔法の弾丸はありません。確かに、一行の声明はありません。 –

答えて

0

私は私のコードで

を再帰を実装する必要があります再帰的にクライアントからロードする代わりに、単一のクエリですべてのフォルダをロードし、EFフィックスアップの関係を聞かせています。すべてのフォルダをロードしたくない場合は、SQLクエリーを特定のフォルダの下にあるフォルダ(例:再帰的なCTEを使用するなど)にのみ使用できます。

はどのようにではなく、体全体、私は私の記事のタイトルのみフィールドを取得行う

EFは、部分的に単一のエンティティをロードサポートしていませんが、あなたはArticleBodyを分割する「表の分割」を使用することができますそれが同じテーブルにある場合でも、別のエンティティに変換します。

+0

*すべてのフォルダをロードすると言っても、これは悪い考えではありませんでした。私はあなたが実際にそれを言うことを意味すると思うようになりました。もちろん、すべての記事をロードすることは悪い考えです。これは恐らくダウンワードの理由です。 –

+0

はい、すべてのフォルダを読み込む必要があります。どちらのエンティティにも関係があります。ポイントは、Eager Loading、Lazy Loading、およびExplicit Loading以外に、オブジェクトグラフを作成するためのあまり知られていない第4の方法があります。 DbContextに複数のエンティティをロードするだけで、EFはすべてのナビゲーションプロパティに接続します。 –

関連する問題