LINQ和AutoMapper(LINQ and AutoMapper)

2019-07-19 14:40发布

我想知道如果有什么我可以做的像预期的那样得到这个工作。 这在我的代码工作正常:

        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到实体无法识别方法‘Security.Dto.RoleDto MapRole,RoleDto’方法,和这种方法不能被翻译成存储表述”

我不知道如果我甚至可以做this'problem” ......可以说,工程是更具可读性反正方法什么...

Answer 1:

你对工作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();


文章来源: LINQ and AutoMapper