2

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

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

Я заметил, что я не мог сделать foreach (Пользователь пользователя в роли.Users), но UserReference, похоже, работает, но так ли это, как это должно быть сделано? Пройдя через ссылку?

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

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

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

+0

Это вызывает создание третьей коллекции, где требуются только IEnumerables. «Список пользователей», результат '.ToArray()' и результат этого '.ToList()' –

+1

Вопрос состоял в том, как прокручивать все пользователи, а не имена пользователей. – ktingle

+0

Вопрос был: Я хочу, чтобы все пользователи, имеющие определенную роль, были в списке имен пользователей. Код, заданный в вопросе, возвращает строку ']', содержащую имена пользователей всех пользователей в указанной роли. Даже если перехват пользователей будет назначением, ToList не будет там ненужным. –

2

Возможно ли, что ваша таблица Роль имеет свойство 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

Метод Include не требуется, так как связанные объекты пользователя обращаются к нему внутри активного объекта ObjectContext. –

+0

@ Enrico - спасибо, я оставил его по ошибке (копирование/вставка). – tvanfosson

-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 в запросе заставляет его находиться в одном запросе без необходимости его включения, поскольку он используется в активном объектно-ориентированном объекте.

Одно замечание стороны, я не уверен, что такое подпись метода этого метода, но в этом случае IEnumerable<string>, вероятно, лучше подходит, чем string[], потому что вы можете отрегулировать реализацию позже, не создавая массивы из других типов коллекции.