我希望将具有特定角色的所有用户都添加到用户名列表中。
使用.Include来包含所有用户,并通过UsersReference 循环遍历与角色关联的所有用户的最佳方式是什么?
我注意到我无法做foreach(在role.Users中的用户用户),但是UsersReference似乎可以工作,但它应该如何完成?通过参考?
using (var context = new MyEntities())
{
List<string> users = new List<string>();
Role role = (from r in context.Roles.Include("Users")
where r.RoleName == roleName
select r).FirstOrDefault();
foreach (User user in role.UsersReference)
users.Add(user.UserName);
return users.ToArray();
}
答案 0 :(得分:2)
您的Role表是否可能具有Users属性?我认为它会将导航属性命名为Users,而不是UsersReference。我没有使用EF,但我看过的所有例子都在表格之后命名。 AFAIK它总是实现IEnumerable,所以你应该能够在foreach中使用它。
如果你设置正确,我认为你只需要:
using (var context = new MyEntities())
{
return context.Roles
.Where( r => r.RoleName == roleName )
.SelectMany( r => r.Users )
.Select( u => u.UserName )
.ToArray();
}
答案 1 :(得分:0)
尝试将原始foreach循环与 ToList ()
一起使用 foreach(var user in role.Users.ToList()) {...}
答案 2 :(得分:-1)
使用.ToArray()
帮助
using (var context = new MyEntities())
{
return (from role in context.Roles
where role.RoleName == roleName
from user in r.Users
select user.UserName).ToArray();
}
请注意,如果您这样做,则无需.Include("Users")
。在查询中使用r.Users
会导致它在一个查询中而不需要包含它,因为它在活动的ObjectContext中使用。
另一方面,我不确定此方法的方法签名是什么,但在这种情况下IEnumerable<string>
可能比string[]
更合适,因为您可以稍后调整实现无需从其他类型的集合创建数组。