If you want to make life easy on yourself, follow the EF Code First conventions of naming your table IDs simply Id (or, alternatively, name of table + Id, e.g., DyanmicPageId).
This should leave you with something like this:
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; } }
Then you need to set up the relationship between parents and children explicitly in an OnModelCreating method in your DbContext class.
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<DynamicPage>() .HasMany(page => page.Children) .WithRequired(child => child.Parent) .HasForeignKey(child => child.ParentId); }
You can then select children or grandchildren as needed:
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);