3

Users、UserRoles、Rolesの3つのテーブルがあります。

  • Usresテーブルの列はUserId(Pk varchar(20))、CashCenterId(Int)です。
  • UserRolesの列は、UserRoleID(pk Int)、UserId(Fk to user table)、RoleID(Fk to role Table)です。
  • ロールの列は、RoleId(Pk int)、RoleName(varchar(30))です。

LINQ toENTITYFrameworkを使用してクエリを実行しています。

ここで、logginユーザーが「FFFAdmin」ロールを持っているかどうかをチェックする関数が必要なので、logginユーザーのUserIdをこの関数に渡し、関数で次のようにします。

     public bool isUserFFFAdmin(string UserId){

       return (from u in Db.Users
                    join ur in Db.UserRoles on u.UserID equals ur.UserID
                    join r in Db.Roles on ur.RoleID equals r.RoleID
                    where r.RoleName == "FFFAdmin" 
                    && u.UserID.Equals(UserId)
                    select '1').Any();
       }

ここで問題となるのは、このクエリでは大文字と小文字が区別されないため、2人のユーザーが

1.ロール「siteUser」の「RAM」2。ロール「FFFAdmin」の「r​​am」

'Ram'を渡すと、この関数はfalseを返すはずですが、このクエリでは大文字と小文字が区別されないため、trueが返されます。

注*データベースの照合タイプを変更して、クエリの大文字と小文字を区別することはできません。私がエンティティとLInqを初めて使用するのを手伝ってください。

4

1 に答える 1

1

タスクを2つの部分に分割します

var users = from u in Db.Users
            join ur in Db.UserRoles on u.UserID equals ur.UserID
            join r in Db.Roles on ur.RoleID equals r.RoleID
            where r.RoleName == "FFFAdmin" 
               && u.UserID == UserId
            select u.UserID;

return users.AsEnumerable().Any(s => s == UserId);

2番目の部分では、大文字と小文字をAsEnumerable()区別するC#環境で実行されますが、メインのフィルタリングタスクは引き続きデータベースジョブです。

于 2013-02-14T20:41:48.353 に答える