2011-04-01 17 views
4

我最近將VS 2005升級到2010年,對於LinQ來說是相當新的。也許有人可以讓我以正確的方式。如何使用LinQ加入(鍵入)數據集?

背景: 我有一個打字的數據集,並具有標準的SQLMembershipProvider擴展一個表Access的AccessRule。所以一個角色可以擁有無​​限的AccessRules(即「Administrator」具有「DeleteCustomer」)。我使用從SqlMemberShipProvider繼承的自定義成員資格提供程序,並具有重載函數hasAccess(其中一個使用內存數據集作爲參數,另一個直接使用數據庫)。

這是完整型號:

enter image description here

現在我需要知道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是迄今爲止最快的查詢。看看我的後續問題:

回答

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

+0

謝謝。但是我得到一個「方法Join的定義在這個上下文中不可訪問」的編譯器錯誤。我假設它與UserInRoles和RoleAccessRule表中的組合鍵有關。有任何想法嗎? – 2011-04-01 23:31:43

+0

對不起,我以前沒有得到這個錯誤。所以我不知道該如何處理它:x您可以嘗試一步一步地(通過關係進行關係) - 製作多個單獨的查詢......它可能有助於查找和處理問題。這可能是因爲那些m:n助手錶,但我看不出有什麼理由不能查詢它們。我還添加了鏈接到SQL-> LINQ工具來回答我的問題。 – Damb 2011-04-01 23:57:55

+0

我只是忘記導入'System.LinQ'命名空間。 – 2011-04-04 07:48:51

1

這個線程可以幫助你轉換你的SQL中的LINQ:

What is the syntax for an inner join in LINQ to SQL?

+0

謝謝。但不幸的是,我已經嘗試過,但我得到一個''方法連接的定義在此上下文中不可訪問'''。我假設它與'UserInRoles'和'RoleAccessRule'表中的組合鍵有關。 – 2011-04-01 23:28:47