Является ли цикл по ссылке на сущность правильным способом?

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

Является ли использование.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 ответа

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

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

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

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

Другие вопросы по тегам