我最近將VS 2005升級到2010年,對於LinQ來說是相當新的。也許有人可以讓我以正確的方式。如何使用LinQ加入(鍵入)數據集?
背景: 我有一個打字的數據集,並具有標準的SQLMembershipProvider擴展一個表Access的AccessRule。所以一個角色可以擁有無限的AccessRules(即「Administrator」具有「DeleteCustomer」)。我使用從SqlMemberShipProvider繼承的自定義成員資格提供程序,並具有重載函數hasAccess(其中一個使用內存數據集作爲參數,另一個直接使用數據庫)。
這是完整型號:
現在我需要知道F.E.如果具有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 [email protected])
總之:
我如何從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是迄今爲止最快的查詢。看看我的後續問題:
謝謝。但是我得到一個「方法Join的定義在這個上下文中不可訪問」的編譯器錯誤。我假設它與UserInRoles和RoleAccessRule表中的組合鍵有關。有任何想法嗎? – 2011-04-01 23:31:43
對不起,我以前沒有得到這個錯誤。所以我不知道該如何處理它:x您可以嘗試一步一步地(通過關係進行關係) - 製作多個單獨的查詢......它可能有助於查找和處理問題。這可能是因爲那些m:n助手錶,但我看不出有什麼理由不能查詢它們。我還添加了鏈接到SQL-> LINQ工具來回答我的問題。 – Damb 2011-04-01 23:57:55
我只是忘記導入'System.LinQ'命名空間。 – 2011-04-04 07:48:51