LINQ和AutoMapper

Jam*_*mer 14 c# linq entity-framework 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;
Run Code Online (Sandbox Code Playgroud)

但改为:

        var roles = _securityContext.Set<Role>();

        return roles.Select(role => Mapper.Map<Role, RoleDto>(role)).ToList();
Run Code Online (Sandbox Code Playgroud)

导致我以前没见过的错误:

"LINQ to Entities无法识别方法'Security.Dto.RoleDto MapRole,RoleDto'方法,并且此方法无法转换为商店表达式"

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

Pat*_*iek 27

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

return roles.ToList().Select(role => Mapper.Map<Role, RoleDto>(role)).ToList();
Run Code Online (Sandbox Code Playgroud)

[编辑]正如丹尼尔暗示的评论,你可以随时从去IQueryableIEnumerable被调用AsEnumerable(),仍然推迟执行:

return roles.AsEnumerable().Select(role => Mapper.Map<Role, RoleDto>(role)).ToList();
Run Code Online (Sandbox Code Playgroud)

  • 使用`AsEnumerable()`代替`ToList()`更好,因为它仍然会执行延迟执行. (12认同)
  • @CodeMonkeyKing`AsEnumerable`将它移动到LINQ to Objects域并将执行推迟到最后一个`ToList()`,而第一个示例一个接一个地创建两个列表.这就是区别.:) (2认同)