JReam
JReam

Reputation: 898

Converting IQueryable string to compare against string

I'm trying to build up a multiselect of admin users to toggle between assigned or unassigned. All seems to be correct except it doesn't like where I'm attempting to assign true or false to the IsInRole property of the UsersInRoleViewModel.

The error is:

Operator '==' cannot be applied to operands of type 'string' and 'System.Linq.IQueryable'

Any assistance is appreciated!

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

Upvotes: 0

Views: 1348

Answers (3)

nandox
nandox

Reputation: 101

Try use string.CompareOrdinal

    string.CompareOrdinal("A","B")
    -1
    string.CompareOrdinal("B","A")
    1
    string.CompareOrdinal("A","A")
    0

Upvotes: 0

pjobs
pjobs

Reputation: 1247

In your case you are doing two trips to db, one trip to get Admin RoleId, and second to get users with AdminRole = Yes/Now

Here is the same query in just one trip to db instead of two in your case.

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

Upvotes: 1

Kenner Dev
Kenner Dev

Reputation: 327

Admin Id is a list of ids. You need to change it to

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

Upvotes: 0

Related Questions