4

私は最近 VS 2005 を 2010 にアップグレードしましたが、LinQ は初めてです。多分誰かが私を正しい方法で配置することができます.

背景: 型指定されたデータセットがあり、Table AccessRule で拡張された標準の SQLMembershipProvider があります。そのため、役割は無限に AccessRules を持つことができます (fe "Administrator" には "DeleteCustomer" があります)。SqlMemberShipProvider から継承し、オーバーロードされた関数 hasAccess を持つカスタム メンバーシップ プロバイダーを使用します (1 つはパラメーターとしてメモリ データセットを持ち、もう 1 つはデータベースを直接使用します)。

これは完全なモデルです:

ここに画像の説明を入力

ここで、UserID='89f9ea8d-8ae1-460b-a430-aa433261feec'を持つユーザーに AccessRule "DeleteCustomer" があるかどうかを知る必要があります。

SQL では、次のようになります。

SELECT     CASE WHEN aspnet_AccessRule.idAccessRule IS NULL THEN 0 ELSE 1 END AS Access
FROM         aspnet_RoleAccessRule INNER JOIN
                      aspnet_AccessRule ON aspnet_RoleAccessRule.fiAccessRule = aspnet_AccessRule.idAccessRule INNER JOIN
                      aspnet_Roles ON aspnet_RoleAccessRule.fiRole = aspnet_Roles.RoleId INNER JOIN
                      aspnet_UsersInRoles ON aspnet_Roles.RoleId = aspnet_UsersInRoles.RoleId
WHERE (aspnet_UsersInRoles.UserId = @UserID) AND    (aspnet_AccessRule.RuleName =@RuleName) 

要するに

LinQ を使用してからaspnet_UsersInRolesに到達するにはどうすればよいですか?aspnet_AccessRule

前もって感謝します...

編集

C# も大歓迎ですが、私は VB.Net を好みます。

これは私が持っているものですが、機能しません。

Dim query = From accRule In dsAuth.aspnet_AccessRule _
                        From roleAccRule In dsAuth.aspnet_RoleAccessRule _
                        From role In dsAuth.aspnet_Roles _
                        From userRole In dsAuth.aspnet_UsersInRoles _
                        Where roleAccRule.fiAccessRule = accRule.idAccessRule _
                        And roleAccRule.fiRole = role.RoleId _
                        And userRole.RoleId = role.RoleId _
                        And userRole.UserId = userID And accRule.RuleName = accessRule
            Select accRule.idAccessRule 
Return query.Any

"Definition of method SelectMany is not accessible in this context"コンパイラの警告が表示され、2 番目の警告Fromが強調表示されます。aspnet_RoleAccessRule と aspnet_UsersInRoles の複合キーと関係があると思います。助言がありますか?

これにより、最初のコンマで同じ例外が発生します。

Dim query = From accRule In dsAuth.aspnet_AccessRule, _
           roleAccRule In dsAuth.aspnet_RoleAccessRule, _
           role In dsAuth.aspnet_Roles, _
           userRole In dsAuth.aspnet_UsersInRoles _
           Where accRule.idAccessRule = roleAccRule.fiAccessRule _
           And roleAccRule.fiRole = role.RoleId _
           And userRole.RoleId = role.RoleId _
           And userRole.UserId = userID And accRule.RuleName = accessRule
     Select accRule.idAccessRule
Return query.Any

これは結合構文ですが、同様のエラーがあります(Joinコンテキストではアクセスできません..):

Dim userID As Guid = DirectCast(Membership.GetUser.ProviderUserKey, Guid)
        Dim query = From accRule In dsAuth.aspnet_AccessRule _
                       Join roleAccRule In dsAuth.aspnet_RoleAccessRule _
                       On accRule.idAccessRule Equals roleAccRule.fiAccessRule _
                       Join role In dsAuth.aspnet_Roles _
                       On role.RoleId Equals roleAccRule.fiRole _
                       Join userRole In dsAuth.aspnet_UsersInRoles _
                       On userRole.RoleId Equals role.RoleId _
                       Where userRole.UserId = userID And accRule.RuleName = accessRule
                 Select accRule.idAccessRule
        Return query.Any

解決策: Namespace をインポートするのを忘れていましたSystem.LinQ。これらのクエリはすべて機能しています。

補足: Join-Syntax は群を抜いて最速のクエリです。私のフォローアップの質問を見てください:なぜ LINQ JOIN は WHERE とリンクするよりもずっと速いのですか?

4

1 に答える 1

3

誰かが来て私に石を投げつけてくるのではないかと心配していますが、チャンスをつかみます。私はおそらくこれから始めます:

var AccessRules = from ar in aspnet_AccessRule
            from rar in aspnet_Role
            from r in aspnet_Roles
            from uir in aspnet_UsersInRoles
            where ar.idaccessrule == rar.fiAccessRule
            where rar.fiRole == r.RoleId
            where r.RoleId == uir.RoleId
            select ar;

うーん..実際にはデータセットがどのように見えるかはわかりませんが、この疑似コードから要点がわかると思います。

編集:これはあなたを助けるかもしれないツールへのリンクです:Linqer

于 2011-04-01T21:09:44.650 に答える