实体框架查询以获取用户的角色名称数组

时间:2017-02-21 15:11:19

标签: arrays entity-framework asp.net-identity

我一直试图找到一个可以检索当前用户角色名称数组的查询。我已经非常接近我的代码并没有返回一个数组。我对实体框架相当新,并且对这种语言中的连接和内部查询非常困惑。如果我在标准sql中工作,我会在子查询中返回所有角色名称,其中roleid位于user.roles中。

现有代码:

var user = from obj in db.Users
                       join obj2 in db.Roles on obj.Id equals obj2.Id
                       where obj.UserName == name select new {
                FirstName =obj.FirstName,
                LastName =obj.LastName,
                Email =obj.Email,
                JoinDate =obj.JoinDate,
                ProfilePic =obj.ProfileSettings.ProfilePicture,
                Roles = ""

            };

我不想使用当前的声明,因为我想确保在调用getUser时返回最准确的角色而不是存储在access_token中的角色。

2 个答案:

答案 0 :(得分:1)

解决方案正在执行group join这样的

var user = from obj in db.Users
           join obj2 in db.Roles on obj.Id equals obj2.Id into roles
           where obj.UserName == name 
           select new {
            FirstName =obj.FirstName,
            LastName =obj.LastName,
            Email =obj.Email,
            JoinDate =obj.JoinDate,
            ProfilePic =obj.ProfileSettings.ProfilePicture,
            Roles = roles.Select(e=>e.Name)
          };

更新

如果您拥有Roles实体的User导航属性,那么您可以这样做:

var user = db.Users.Where(e=>e.UserName == name)
                   .Select(obj=>new {FirstName =obj.FirstName,
                                     LastName =obj.LastName,
                                     Email =obj.Email,
                                     JoinDate =obj.JoinDate,
                                     ProfilePic =obj.ProfileSettings.ProfilePicture,
                                     Roles = obj.Roles.Select(e=>e.Name)
                                    });

答案 1 :(得分:0)

我使用了我对实际SQL的理解,那就是我会做一个子查询来获取这些数据。这可以按照我的意愿运作。

代码:

var user = from obj in db.Users

                       where obj.UserName == name
                       select new
                       {
                           ID1 = obj.Id,
                           FirstName = obj.FirstName,
                           LastName = obj.LastName,
                           Email = obj.Email,
                           JoinDate = obj.JoinDate,
                           ProfilePic = obj.ProfileSettings.ProfilePicture,
                           Roles = (from info in obj.Roles
                                    from allData in db.Roles
                                    where allData.Id == info.RoleId
                                    select allData.Name).ToList()
                       };