2011-06-16 19 views
2

我有五個表中的所有ID爲LINQ到實體:用五個表查詢聯接

  • 用戶
  • User_Role_Relation與外鍵USER_ID和ROLE_ID
  • 角色
  • Role_Right_Relation的主鍵與外交鍵Role_ID和Right_ID
  • Right

我目前得到與下面的查詢所選用戶的權限在存儲過程中

SELECT DISTINCT 
     tbl_Right.ID, tbl_Right.Name  
    FROM 
     tbl_User_Role_Relation 
    INNER JOIN 
     tbl_Role_Right_Relation ON tbl_User_Role_Relation.Role_ID = tbl_Role_Right_Relation.Role_ID 
    INNER JOIN 
     tbl_Right ON tbl_Role_Right_Relation.Right_ID = tbl_Right.ID 
    WHERE 
     tbl_User_Role_Relation.User_ID = @User_ID 

我試圖用這個代碼

var query = from r in context.Rights 
      from rrr in r.Role_Right_Relation 
      from rl in rrr.Role 
      from urr in rl.User_Role_Relation 
      where urr.User_ID == userid 
      select r; 

隱蔽這對LINQ到實體,但我得到的以下錯誤

類型「Models.Role」的表達,在以後允許從子句中與源類型的查詢表達式「System.Linq.IQueryable」類型推斷在調用失敗「選擇許多'

任何意見是有幫助的。

謝謝。

回答

2

首先是LINQ查詢的是做一個交叉連接,而不是內部聯接喜歡你的SQL。你應該退房this

其次,你可能是最好的正確定義EDMX實體之間的關係,你可能根本不必加入,而是可以使用navigation properites來訪問父/子和篩選這些特性直接

實體框架的想法是,你不必壓平

0

編輯3

如果你發佈你的代碼一字不差,那麼你就錯過了線

from u in urr.Users 

所以:

var query = from r in context.Rights 
from rrr in r.Role_Right_Relation 
from rl in rrr.Role 
from urr in rl.User_Role_Relation 
from u in urr.Users 
where u.User_ID == userid 
select r; 

,或者至少有一個錯字和地方應爲:

where urr.User_ID == userid 

導致:

var query = from r in context.Rights 
from rrr in r.Role_Right_Relation 
from rl in rrr.Role 
from urr in rl.User_Role_Relation 
where urr.User_ID == userid 
select r; 
+0

我發佈了一個錯字。我糾正了這個帖子,但我仍然收到錯誤。我得到了與rrr.Role中的rl相關的錯誤 – 2011-06-16 06:10:24

0

如果使用方法的語法,你應該能夠做到像層次:

var user = context.Users.FirstOrDefault(u => u.Id == userId); 
var rights =user.Roles.SelectMany(role => role.Rights).Distinct(); 

請務必檢查用戶是否爲空