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