2

У меня возникла проблема с преобразованием IQueryable в строку [].У меня возникло исключение NotSupportedException при преобразовании IQueryable в строку []

public string[] GetRolesForUser(User user) 
    { 
     if (!UserExists(user)) 
      throw new ArgumentException(MissingUser); 

     var qry = from x in entities.Roles 
       where x.Users.Contains(user) 
       select x.RoleName; 

     return qry.ToArray(); // At this point I've got a NotSupportedException 
    } 

Сообщение об исключении:

Невозможно создать постоянное значение типа 'SchoolMS.Models.Entities.User'. В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid).

Пожалуйста, помогите, как я могу исправить это? Каков правильный путь?

(я использую EF 4.1 с mvc3)

+0

Я предполагаю, что проблема заключается в 'x.Users.Contains()'. Будет ли работать пользователь 'x.Users ==? –

+0

Я пробовал, но у меня такое же исключение – mrtn

ответ

0

Проблема решена.

Я использую многие ко многим между моих пользователей и ролей (таблица UsersInRoles обеспечивает его), поэтому мой запрос не подходит для этого

Я изменил запрос внутри моего метода, и это работающий нормально ..

public string[] GetRolesForUser(User user) 
{ 
    if (!UserExists(user)) 
     throw new ArgumentException(MissingUser); 

    var qry = entities.Users 
     .Where(u => u.UserID == user.UserID) 
     .SelectMany(x => x.Roles.Select(r => r.RoleName)); 

    return qry.ToArray(); 
} 
1

Я подозреваю, что проблема заключается в том, что структура организации не может создать константу для user переменной в запросе. Одним из решений может стать создание объединения вручную, а не использовать Contains:

var qry = from x in entities.Roles 
      join Users u on u.RoleId = x.Id 
      where u.Id = user.Id 
      select x.RoleName 
0

Я хотел бы рассмотреть, чтобы написать

var qry = from x in entities.Roles 
    where x.Users.Select(u => u.Id).Contains(user.Id) 
    select x.RoleName; 

Так было бы примитивный тип, как просили.

Смежные вопросы