按实体框架中的ID获取元素列表

时间:2011-04-11 16:42:56

标签: c# .net ef-code-first entity-framework-4.1

如何通过ID获取另一个列表中的所有元素?例如;我有List角色;我想从他们的Id中获取此列表中数据库中的所有角色。

我正在使用代码优先。

我这样做了,它引发了一个错误:

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

RoleId的类型为int。

错误:

  

无法创建“SampleMVC.Domain.Role”类型的常量值。在此上下文中仅支持原始类型(例如Int32,String和Guid')。

3 个答案:

答案 0 :(得分:57)

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

答案 1 :(得分:10)

如果user.Roles是一个int列表,那么这样的东西应该有效:

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

将其转换为SQL中的“SELECT WHERE IN(x,y,z ...)”。

答案 2 :(得分:0)

您无法将本地列表与远程数据组合在一起,因此数据库中没有任何内容可供读取(在您的客户端上)。

我认为可能会有更好的解决方案来解决你想要做的事情;

您似乎正在尝试获取分配给特定用户的所有角色。如果是这种情况,我会建议一个解决方案,您将当前用户ID传递给数据库并获取分配有INNER JOIN的角色。

根据您的数据库,它可能看起来像这样(如果您通过名为'UserRoles'的表连接具有角色的用户)

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

(当然,如果你喜欢直接在数据库中并映射它,你也可以创建一个返回'Role'列表的存储过程。)