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 个级别:父级 -> 子级 -> 孙子级。如何加载父级(级别 1)和所有关联的子级(级别 2)以及每个子级、关联的孙子级(级别 3)(如果有)?感谢帮助。

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 Code First 约定,简单地命名您的表 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 回答