我很难理解为什么LINQ给出了与预期不同的结果。在下面的代码中,第一个return语句总是返回false。如果我暂停执行并检查roles变量,我可以看到其中一个角色的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;
答案 0 :(得分:0)
看起来您使用的是Entity Framework或其他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);