1

我很难理解为什么 LINQ 给我的结果与预期的不同。在我下面的代码中,第一个 return 语句总是返回 false。如果我暂停执行并检查角色变量,我可以看到其中一个角色的 RoleID 为 1,即 RolesEnum.SystemAdmin 的值。尽管如此,计数为 0。我也尝试过使用 Any() 并产生相同(不正确)的结果。

注释掉第一个 return 语句,第二个 return 语句可以正常工作。

任何关于行为差异原因的见解或解释都值得赞赏。

谢谢。

var roles = GetRoleRepository(database).GetRolesForUser(userEmail);

// Why is this always false?
return (roles.Where(userRoles => userRoles.RoleID == (int)Roles.RolesEnum.SystemAdmin).Count() > 0);

bool isUserInSystemAdminRole = false;

foreach (Role role in roles)
    if (role.RoleID == (int)Roles.RolesEnum.SystemAdmin)
        isUserInSystemAdminRole = true;

// this returns the correct result
return isUserInSystemAdminRole;
4

1 回答 1

0

看起来您使用实体框架或其他 ORM。他们不知道如何将此表达式转换为 SQL 语句。所以像这样事先进行转换

var roles = GetRoleRepository(database).GetRolesForUser(userEmail);

int roleId = (int)Roles.RolesEnum.SystemAdmin;
return (roles.Where(userRoles => userRoles.RoleID == roleId).Count() > 0);

更好的解决方案是:

var roles = GetRoleRepository(database).GetRolesForUser(userEmail);

int roleId = (int)Roles.RolesEnum.SystemAdmin;
return roles.Any(userRoles => userRoles.RoleID == roleId);
于 2013-11-06T01:07:41.337 回答