1

LINQ が予想とは異なる結果をもたらす理由を理解するのに苦労しています。以下のコードでは、最初の return ステートメントは常に false を返します。実行を一時停止してロール変数を調べると、いずれかのロールの RoleID が 1、つまり RolesEnum.SystemAdmin の値であることがわかります。それにもかかわらず、カウントは 0 です。Any() も使用してみましたが、同じ (正しくない) 結果が生成されます。

最初の return ステートメントをコメントアウトすると、2 番目の 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

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);
于 2013-11-06T01:07:41.337 に答える