Является ли циклический просмотр ссылки на сущность правильным способом? - PullRequest
2 голосов
/ 21 марта 2010

Я хочу получить список пользователей с определенной ролью в списке имен пользователей.

Использует .Include для включения всех пользователей и проходит через UsersReference лучший способ перебрать всех пользователей, связанных с ролью?

Я заметил, что не могу сделать foreach (пользователь User в 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 ]

2 голосов
/ 21 марта 2010

Возможно ли, что ваша таблица ролей имеет свойство 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();
}
0 голосов
/ 21 марта 2010

Используйте помощник .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[], потому что вы можете настроить реализацию позже, не создавая массивы из другие виды коллекций.

0 голосов
/ 21 марта 2010

Попробуйте использовать свой оригинальный цикл foreach с ToList ()

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

...