2011-04-11 88 views
14

如何通過ID獲取另一個列表中的所有元素?例如;我有名單角色;我想通過他們的Id來獲取這個列表中的數據庫中的所有角色。通過實體框架中的ID獲取元素列表

我使用的是代碼優先。

我這樣做,它拋出一個錯誤:

var roles = db.Roles.Where(r => user.Roles.Any(ur => ur.RoleId == r.RoleId)); 

RoleId是int類型。

錯誤:

Unable to create a constant value of type 'SampleMVC.Domain.Role'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.

回答

42
var listOfRoleId = user.Roles.Select(r => r.RoleId); 
var roles = db.Roles.Where(r => listOfRoleId.Contains(r.RoleId)); 
+0

這是一個數據庫調用? – 2011-04-11 18:17:19

+0

應該是,檢查生成的SQL,或者在LinqPad中嘗試使用 – 2011-04-11 18:21:19

+0

如果'user'被加載實體,並且它已經加載了'Roles',它將會是一個查詢。 – 2011-04-11 20:13:47

-1

不能與遠程數據結合本地列表,那麼就沒有爲DB從因爲數據是elsewere讀(客戶機上)。

我認爲可能有更好的解決方案,你想要做什麼;

看起來好像你正試圖獲取分配給特定用戶的所有角色。如果是這種情況,我會建議一個解決方案,將當前用戶標識傳遞給數據庫並獲取分配有INNER JOIN的角色。

根據您的數據庫上它可能是這個樣子(如果你通過一個表連接與角色的用戶稱爲「的UserRole」)

var roles = db.UserRoles.Where(x => x.UserID == <insert id>).Select(x => x.Role) 

(當然你也可以創建一個存儲過程返回的「角色」,如果你喜歡直接在你的數據庫並將其映射列表)

7

事情是這樣的,如果user.Roles應該工作是整數的列表:

var roles = db.Roles.Where(r => user.Roles.Contains(r.RoleId)); 

臨屋t在SQL中將它變成「SELECT WHERE IN(x,y,z ...)」。

+0

我不能使用r.RoleId,因爲角色是一個類,而RoleId是一個int。 – 2011-04-11 17:21:16

+1

想法很好!你可以在'... user.Roles ...'和'....'之間插入一個'.Select(ur => ur.RoleId).'。我很好奇,如果查詢工作。 – Slauma 2011-04-11 17:45:19