using System.Collections.Generic;
using System.Data.Entity;
using System.Linq.Dynamic.Core;
public static void Main()
SelectMany_DynamicTyped();
SelectMany_Dynamic_IntoType();
private static void SelectMany()
var context = new EntityContext();
var result = context.Users.SelectMany("u => u.Roles.Select(r => r.Name)").ToDynamicArray();
Console.WriteLine("All role-names : {0}", string.Join(", ", result));
private static void SelectMany_Dynamic()
var context = new EntityContext();
var result = context.Users.SelectMany("Roles.SelectMany(Permissions)").Select("Name");
FiddleHelper.WriteTable(result);
private static void SelectMany_DynamicTyped()
var context = new EntityContext();
var result = context.Users.SelectMany<Permission>("Roles.SelectMany(Permissions)");
FiddleHelper.WriteTable(result);
private static void SelectMany_Dynamic_IntoType()
var context = new EntityContext();
var result = context.Users.SelectMany(typeof(Permission), "Roles.SelectMany(Permissions)");
FiddleHelper.WriteTable(result);
public static void GenerateData()
var permissionAdmin1 = new Permission { Name = "p-Admin" };
var permissionAdmin2 = new Permission { Name = "p-User" };
var permissionManager1 = new Permission {Name = "p-Manager" };
Permissions = new List<Permission> { permissionAdmin1, permissionAdmin2 }
var managerRole = new Role
Permissions = new List<Permission> { permissionManager1 }
var users = new List<User>
new User { Name = "Jack", Roles = new List<Role> { managerRole } },
new User { Name = "Mike", Roles = new List<Role> { managerRole, adminRole } }
using (var context = new EntityContext())
context.Users.AddRange(users);
context.BulkSaveChanges();
public class EntityContext : DbContext
public EntityContext() : base(FiddleHelper.GetConnectionStringSqlServer())
public DbSet<User> Users { get; set; }
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Role> Roles { get; set; }
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Permission> Permissions { get; set; }
public int Id { get; set; }
public string Name { get; set; }