Я получил NotSupportedException при преобразовании IQueryable в строку [] - PullRequest
2 голосов
/ 11 февраля 2012

У меня проблема с преобразованием 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)

Ответы [ 3 ]

1 голос
/ 11 февраля 2012

Я подозреваю, что проблема в том, что структура сущностей не может создать константу для переменной 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 голосов
/ 12 февраля 2012

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

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

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

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();
}
0 голосов
/ 11 февраля 2012

Я бы посоветовал написать

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

Так что это будет примитивный тип, как и просили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...