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