循环通过entityreference正确的方式?

时间:2010-03-21 13:20:25

标签: c# linq entity-framework linq-to-entities entityreference

我希望将具有特定角色的所有用户都添加到用户名列表中。

使用.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();
        }

3 个答案:

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