我想知道是否有什么我可以做的以达到预期的效果。这在我的代码中工作正常:

        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'方法,并且该方法无法转换为商店表达式”

我不确定我是否可以对这个“问题”做任何事情...可以说,有效的方法无论如何都更具可读性...

最佳答案

您正在使用IQueryable,它将尝试将您提供的方法转换为SQL。显然,这不会发生,因为您正在传递与AutoMapper相关的魔术。有一个简单的解决方案,您必须在映射之前强制执行:

return roles.ToList().Select(role => Mapper.Map<Role, RoleDto>(role)).ToList();

[编辑]正如丹尼尔在评论中所建议的,您始终可以通过调用IQueryableIEnumerable转到AsEnumerable(),而仍然推迟执行:
return roles.AsEnumerable().Select(role => Mapper.Map<Role, RoleDto>(role)).ToList();

关于c# - LINQ和AutoMapper,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14770941/

10-14 08:14