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();
}