2010-03-21 91 views
2

我想让所有具有特定角色的用户都成为用户名列表。循环通过entityreference的正确方法?

正在使用.Include包括所有用户,并通过UsersReference 循环浏览与该角色关联的所有用户的最佳方式?

我注意到我无法做一个foreach(User.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

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

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

+0

这会导致只需要IEnumerables的情况下创建第三个集合。 '列表用户','.ToArray()'的结果和'.ToList()'的结果 – 2010-03-21 13:41:06

+1

问题是如何遍历所有用户而不是用户名。 – ktingle 2010-03-21 13:58:05

+0

现在的问题是:我想让所有具有特定角色的用户都成为用户名列表。问题中提供的代码返回一个包含指定角色中所有用户的用户名的字符串[]。即使循环遍历用户将是分配,ToList也不需要。 – 2010-03-21 15:41:30

2

有没有可能是你的角色表中有一个用户的财产?我会认为它会命名导航属性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

Include方法不是必需的,因为相关的User对象正在一个活动的ObjectContext内被访问。 – 2010-03-21 13:41:20

+0

@Enrico - 谢谢,我误将它留下了(复制/粘贴)。 – tvanfosson 2010-03-21 17:50:25

-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[]更合适,因为您可以稍后调整实现而不创建其他类型的数组集合。