LINQ и AutoMapper
Мне интересно, есть ли что-нибудь, что я могу сделать, чтобы это работало, как ожидалось. Это отлично работает в моем коде:
var roles = _securityContext.Set<Role>();
var roleList = new List<RoleDto>();
foreach (var role in roles)
{
roleList.Add(Mapper.Map<Role, RoleDto>(role));
}
return roleList;
Но изменив это на:
var roles = _securityContext.Set<Role>();
return roles.Select(role => Mapper.Map<Role, RoleDto>(role)).ToList();
Результаты с ошибкой, которую я раньше не видел:
"LINQ to Entities не распознает метод" Security.Dto.RoleDto MapRole, RoleDto ", и этот метод не может быть переведен в выражение хранилища"
Я не уверен, могу ли я что-нибудь сделать с этой "проблемой"... возможно, способ, который работает, более читабельен в любом случае...
Ответы
Ответ 1
Вы работаете в IQueryable
, который пытается перевести метод, который вы поставляете в SQL. Очевидно, это не произойдет, поскольку вы передаете магию, связанную с AutoMapper. Там простое решение, вы должны принудительно выполнить до отображения:
return roles.ToList().Select(role => Mapper.Map<Role, RoleDto>(role)).ToList();
[EDIT] Как предлагает Дэниел в комментариях, вы всегда можете перейти от IQueryable
до IEnumerable
, вызвав AsEnumerable()
и все еще отложить выполнение:
return roles.AsEnumerable().Select(role => Mapper.Map<Role, RoleDto>(role)).ToList();