using System.Collections.Generic;
using System.Data.Entity;
public static void Main()
using (var context = new EntityContext())
var employees = context.Employees.Where(x => x.Name.StartsWith("Employee_"))
.ToSelfHierarchyList(x => x.Boss);
FiddleHelper.WriteTable("1 - Employee", employees);
FiddleHelper.WriteTable("2 - Boss", employees.Select(x => x.Boss).Distinct());
FiddleHelper.WriteTable("3 - CEO", employees.Select(x => x.Boss.Boss).Distinct());
public static void SeedEmployee()
using (var context = new EntityContext())
var ceo_1 = new Employee() { Name = "CEO_1" };
var boss_1 = new Employee() { Name = "Boss_1", Boss = ceo_1 };
var boss_2 = new Employee() { Name = "Boss_2", Boss = ceo_1 };
var employee_1 = new Employee() { Name = "Employee_1", Boss = boss_1 };
var employee_2 = new Employee() { Name = "Employee_2", Boss = boss_2 };
var employee_3 = new Employee() { Name = "Employee_3", Boss = boss_2 };
context.Employees.AddRange(new List<Employee>() { ceo_1, boss_1, boss_2, employee_1, employee_2, employee_3 });
context.BatchSaveChanges();
public class EntityContext : DbContext
public EntityContext() : base(FiddleHelper.GetConnectionStringSqlServer())
protected override void OnModelCreating(DbModelBuilder modelBuilder)
modelBuilder.Entity<Employee>()
.HasOptional(x => x.Boss)
base.OnModelCreating(modelBuilder);
public DbSet<Employee> Employees { get; set; }
public int EmployeeID { get; set; }
public string Name { get; set; }
public Employee Boss { get; set; }