转换 IQueryable 字符串以与字符串进行比较

问题描述 投票:0回答:3

我正在尝试建立管理员用户的多重选择,以在已分配或未分配之间切换。一切似乎都是正确的,只是它不喜欢我尝试将 true 或 false 分配给

IsInRole
UsersInRoleViewModel
属性。

错误是:

运算符“==”不能应用于“string”和“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);
}
asp.net-mvc linq
3个回答
1
投票

在您的情况下,您将进行两次数据库访问,一次访问获取 Admin RoleId,第二次访问具有 AdminRole = Yes/Now 的用户

在您的情况下,这是一次数据库访问中的相同查询,而不是两次。

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 };

0
投票

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

var adminId = db.Roles.Where(r => r.Name == "管理员").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);
        }

0
投票

尝试使用

string.CompareOrdinal

    string.CompareOrdinal("A","B")
    -1
    string.CompareOrdinal("B","A")
    1
    string.CompareOrdinal("A","A")
    0
© www.soinside.com 2019 - 2024. All rights reserved.