gpt4 book ai didi

.net - 如何将 LinQ 加入(类型化)数据集?

转载 作者:行者123 更新时间:2023-12-01 01:29:51 27 4
gpt4 key购买 nike

我最近将 VS 2005 升级到了 2010 年,对 LinQ 还很陌生。也许有人可以把我放在正确的方式。

背景 :
我有一个类型化数据集,并且使用 Table AccessRule 扩展了标准 SQLMembershipProvider。所以一个角色可以有无限的 AccessRules(例如“管理员”有“DeleteCustomer”)。我使用从 SqlMemberShipProvider 继承的自定义成员资格提供程序,并具有重载函数 hasAccess(一个以内存数据集作为参数,另一个直接使用数据库)。

这是完整的模型:

enter image description here

现在我需要知道 f.e.如果用户 ID= '89f9ea8d-8ae1-460b-a430-aa433261feec'具有访问规则“删除客户”。

在 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_UsersInRolesaspnet_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 中的复合键有关。有什么建议?

这在第一个逗号上给出了相同的异常(exception):
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 是迄今为止最快的查询。看看我的后续问题: Why is LINQ JOIN so much faster than linking with WHERE?

最佳答案

我害怕有人会来向我扔石头,但我会捕获机会。我可能会从这个开始:

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

关于.net - 如何将 LinQ 加入(类型化)数据集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5518746/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com