LINQ to Entities не распознает метод "Int32 ToInt32 (System.Object)", и этот метод не может быть переведен в выражение хранилища

Вот что я пытаюсь сделать:

public List<int> GetRolesForAccountByEmail(string email)
{
    var account = db.Accounts.SingleOrDefault(a => a.Email == email);
    if (account == null) return new List<int>();

    return db.AccountRoles.Where(a => a.AccountId == account.AccountId).Select(a => Convert.ToInt32(a.RoleId)).ToList();
}

Мне пришлось преобразовать в Int32, потому что я не смог вернуть List<int?>, когда метод должен был вернуть List<int>.

Любые предложения по решению этой простой проблемы?

Ответ 1

Вместо этого:

Select(a => Convert.ToInt32(a.RoleId))

Сделайте это:

Select(a => a.RoleId.Value)

Причина в описании ошибки; когда вы выполняете эти запросы через IQueryable, методы, используемые в селекторе, должны быть чем-то, что можно перевести в SQL-запрос или функцию. В этом случае Convert.ToInt32() не является таким методом. Для допустимых полей int с null допустимо использование свойства .NET .Value.

Обратите внимание, что это не сработает, если ваш RoldId равен null. Вы получите InvalidOperationException. Вместо этого вы можете вернуть заданное значение, если поле поддержки имеет значение null:

Select(a => a.RoleId.HasValue ? a.RoleId.Value : int.MinValue)

Это вернет значение, если оно есть, и int.MinValue, если нет.

Ответ 2

Используйте это: Выберите (a = > (int) a.RoleId)

Ответ 3

Попробуйте взять объект List из db.Accounts и сделать материал. Это работает для меня.

public List<int> GetRolesForAccountByEmail(string email)
{
    var account = db.Accounts.SingleOrDefault(a => a.Email == email);
    if (account == null) return new List<int>();
    return db.AccountRoles.Where(a => a.AccountId == account.AccountId).Select(a => Convert.ToInt32(a.RoleId)).ToList();
}

Вместо этого попробуйте это.

public List<int> GetRolesForAccountByEmail(string email)
    {
    var account = db.Accounts.SingleOrDefault(a => a.Email == email);
    if (account == null) return new List<int>();
    List<AccountRoles> accountRoles= db.AccountRoles.ToList<AccountRoles>();
    return accountRoles.Where(a => a.AccountId == account.AccountId).Select(a => Convert.ToInt32(a.RoleId)).ToList();
    }