7

私はこのエンティティを持っています:

public class DynamicPage {

    public int PageId { get; set; }

    public int Order { get; set; }

    public string MenuText { get; set; }

    public string MenuHover { get; set; }

    public int? ParentId { get; set; }

    public virtual DynamicPage Parent { get; set; }

    public virtual ICollection<DynamicPage> Children { get; set; }
}

このエンティティには、親->子->孫の3つのレベルがあります。関連するすべての子(レベル2)と、子ごとに、関連する孫(レベル3)がある場合は、親(レベル1)をロードするにはどうすればよいですか?助けてくれてありがとう。

4

2 に答える 2

12

EF 4.1の機能と構文:

var entity = context.Parents
    .Include(p => p.Children.Select(c => c.GrandChildren))
    .FirstOrDefault(p => p.Id == 1); // or whatever condition
于 2011-09-22T17:39:49.720 に答える
0

自分の生活を楽にしたい場合は、EFコードファーストの規則に従って、テーブルIDに単純に名前を付けますId(または、テーブルの名前+IdなどDyanmicPageId)。

これにより、次のようなものが残ります。

public class DynamicPage
{
    public int Id { get; set; }
    public int Order { get; set; }
    public string MenuText { get; set; }
    public string MenuHover { get; set; }
    public int? ParentId { get; set; }

    public virtual DynamicPage Parent { get; set; }
    public virtual ICollection<DynamicPage> Children { get; set; }
}

OnModelCreating次に、クラスのメソッドで親と子の関係を明示的に設定する必要がありますDbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<DynamicPage>()
        .HasMany(page => page.Children)
        .WithRequired(child => child.Parent)
        .HasForeignKey(child => child.ParentId);
}

その後、必要に応じて子供または孫を選択できます。

var parent = dbContext.DynamicPages.Where(page => page.ParentId == null);
var children = parent.Children;
var grandchildren = parent.SelectMany(page => page.Children);
var allRelatedPages = parent.Union(children).Union(grandchildren);
于 2011-09-22T00:51:28.440 に答える