2016-03-24 55 views
0

我遇到了映射Roles属性的问题,所以它对应于UserViewModelLinq把实体投影到IEnumerable中

var userManager = Request.GetOwinContext().GetUserManager<ApplicationUserManager>(); 

var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext())); 

var users = (from u in userManager.Users 
      join r in roleManager.Roles 
      on u.Id equals r.Id   
      select new UserViewModel { Id = u.Id, Username = u.UserName, Password = u.PasswordHash, Roles = select new Role { Name = r.Name }}); 

public class UserViewModel 
{ 
    public string Id { get; set; } 
    public string Username { get; set; } 
    public string Password { get; set; } 
    public IEnumerable<Role> Roles { get; set; } 
} 

public class Role 
{ 
    public string Name { get; set; } 
} 

我该如何让Linq实体投影?

回答

0

我觉得你有你的查询设置它最有可能不会在上班的路上,你需要一个子查询,因为你需要返回与列表中的项目/名单我会做类似

由于您使用不同的上下文,你可以尝试做以下 我会建议你有一些使用语句,所以你会清理你的内存,但你可以转换它使用列表到实际内存对象,然后过滤内存对象(只要确保您的数据是不要大)

var userManager = Request.GetOwinContext().GetUserManager<ApplicationUserManager>().Users.ToList(); 

var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext())).Roles.ToList(); 


var users = (from u in userManager.Users  
       select new UserViewModel 
       { 
        Id = u.Id, 
        Username = u.UserName, 
        Password = u.PasswordHash, 
        Roles =(from r in roleManager.Roles 
          where r.Id==u.Id 
          select new Role 
          { 
           Name = r.Name 
           }).ToList()); 
+0

试过那种子查询,但它总是“指定的LINQ表达式包含引用查看与不同上下文相关的查询。“如在这种情况下。 – netdis

+0

尝试以上更新 –

+0

现在开始工作,直接在'var userManager'中指定它,从roleManager.Roles'中的'r中移除角色。在当前设置调用ToList是好的。 – netdis