15

我想知道我是否可以做些什么来让它按预期工作。这在我的代码中运行良好:

        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' 方法,并且此方法无法转换为存储表达式”

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

4

1 回答 1

29

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

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

[编辑] 正如丹尼尔在评论中建议的那样,您始终可以通过调用从IQueryable到并仍然推迟执行:IEnumerableAsEnumerable()

return roles.AsEnumerable().Select(role => Mapper.Map<Role, RoleDto>(role)).ToList();
于 2013-02-08T10:56:03.177 回答