2

我想让所有具有特定角色的用户加入用户名列表。

是否使用 .Include 包含所有用户,并通过 UsersReference 循环遍历与角色关联的所有用户的最佳方式?

我注意到我无法执行 foreach(User user in 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();
        }
4

3 回答 3

2

您的 Role 表是否有可能具有 Users 属性?我认为它将命名导航属性用户,而不是用户参考。我不使用 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();
}
于 2010-03-21T13:34:40.653 回答
0

尝试使用ToList ()的原始 foreach 循环

foreach(var user in role.Users.ToList()) {...}

于 2010-03-21T13:25:25.240 回答
-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[],因为您可以稍后调整实现,而无需从其他类型的集合创建数组。

于 2010-03-21T13:36:31.260 回答