我最近将 VS 2005 升级到 2010 并且对 LinQ 来说还算新。也许有人可以让我以正确的方式。
背景:我有一个类型化的数据集,并且标准 SQLMembershipProvider 使用 Table AccessRule 扩展。所以一个角色可以有无限的AccessRules(fe“Administrator”有“DeleteCustomer”)。我使用从 SqlMemberShipProvider 继承的自定义成员资格提供程序,并具有重载函数 hasAccess(一个以内存数据集作为参数,另一个直接使用数据库)。
这是完整的模型:
现在我需要知道用户 ID= 的用户'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)
简而言之:
我如何aspnet_UsersInRoles
使用aspnet_AccessRule
LinQ?
先感谢您...
编辑:
虽然也欢迎 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"
编译器警告,第二个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
解决方案:我忘记导入命名空间System.LinQ
。所有这些查询都有效。
旁注:Join-Syntax 是迄今为止最快的查询。看看我的后续问题:为什么 LINQ JOIN 比链接 WHERE 快得多?