我想知道我是否可以做些什么来让它按预期工作。这在我的代码中运行良好:
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();
[EDIT]正如Daniel在评论中建议的那样,您可以通过调用AsEnumerable()
从IQueryable
转到IEnumerable
,并且仍然推迟执行:
return roles.AsEnumerable().Select(role => Mapper.Map<Role, RoleDto>(role)).ToList();