【问题标题】:Converting IQueryable string to compare against string将 IQueryable 字符串转换为与字符串进行比较
【发布时间】:2015-07-12 13:28:57
【问题描述】:

我正在尝试建立一个多选的管理员用户来在已分配或未分配之间切换。一切似乎都是正确的,除了它不喜欢我试图将真或假分配给UsersInRoleViewModelIsInRole 属性的位置。

错误是:

运算符“==”不能应用于“字符串”和“System.Linq.IQueryable”类型的操作数

感谢任何帮助!

public ActionResult EditRoles()
{
    // AdminUsers
    var adminId = db.Roles.Where(r => r.Name == "Administrator").Select(r => r.Id);

    var users = db.Users.Select(u => new UsersInRoleViewModel 
                                     {
                                         UserId = u.Id,
                                         DisplayName = u.DisplayName, 
                                         IsInRole = u.Roles.Where(r => r.RoleId == adminId)
                                     });

    var adminUsers = users.Where(u => u.IsInRole).Select(n => n.UserId).ToArray();

    var adminMultiSelect = new MultiSelectList(users, "Id", "DisplayName", adminUsers);

    var model = new UserSelectListsViewModel { AdminUsers = adminMultiSelect, SelectedAdmins = adminUsers, DevUsers = null, PMUsers = null, SubUsers = null };

    return View(model);
}

【问题讨论】:

  • 您正在分配一个枚举值,它需要一个布尔值(大概)。 IsInRole 应该属于哪个角色?
  • 与'Administrator'关联的角色表中的id

标签: asp.net-mvc linq


【解决方案1】:

在您的情况下,您要访问 db 两次,一次获取 Admin RoleId,第二次获取 AdminRole = Yes/Now 的用户

这是一次访问 db 的相同查询,而不是您的情况下的两次。

var adminUsers = db.Roles.Where(r => r.Name == "Administrator")
                         .SelectMany(r => r.Users.Select(u => new UsersInRoleViewModel 
                                             {
                                                 UserId = u.Id,
                                                 DisplayName = u.DisplayName)).toList();

var users = db.Users.Select(u=> new UsersInRoleViewModel 
                                {
                                   UserId = u.Id,
                                   DisplayName = u.DisplayName)).toList();

var adminMultiSelect = new MultiSelectList(users, "Id", "DisplayName", adminUsers);

var model = new UserSelectListsViewModel { AdminUsers = adminMultiSelect, SelectedAdmins = adminUsers, DevUsers = null, PMUsers = null, SubUsers = null };

【讨论】:

  • 我不确定这是否会完全按原样工作,但这是个好主意。
  • 这只是让我进入连接表,但我喜欢这个概念!
  • 我认为您总是可以通过执行 db.Users.Select(mappingToViewModel).ToList() 来获取所有用户,无论如何都更新了答案。
【解决方案2】:

Admin Id 是一个 id 列表。您需要将其更改为

var adminId = db.Roles.Where(r => r.Name == "Administrator").Select(r => r.Id).First().ToString();

 public ActionResult EditRoles()
        {
            //AdminUsers

            var adminId = db.Roles.Where(r => r.Name == "Administrator").Select(r => r.Id).First().ToString();

            var users = db.Users.Select(u => new UsersInRoleViewModel 
                                                    {
                                                        UserId = u.Id,
                                                        DisplayName = u.DisplayName, 
                                                        IsInRole = u.Roles.Where(r => adminId == r.RoleId))
                                                    });

            var adminUsers = users.Where(u => u.IsInRole).Select(n => n.UserId).ToArray();

            var adminMultiSelect = new MultiSelectList(users, "Id", "DisplayName", adminUsers);

            var model = new UserSelectListsViewModel { AdminUsers = adminMultiSelect, SelectedAdmins = adminUsers, DevUsers = null, PMUsers = null, SubUsers = null };

            return View(model);
        }

【讨论】:

    猜你喜欢
    • 2017-02-20
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多