2011-04-11 57 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