2013-02-08 44 views
10

我想知道是否有任何事情可以做到按預期工作。這工作正常,在我的代碼:LINQ和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; 

但改變這:在一個錯誤

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

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

結果我從來沒見過的:

「LINQ到實體無法識別方法'Security.Dto.RoleDto MapRole,RoleDto'方法,並且此方法不能轉換爲商店表達式「

我不確定我是否可以對此'問題'做任何事情......可以說是m方法工作更可讀...

回答

21

您正在運行IQueryable,它試圖將您提供的方法轉換爲SQL。顯然,這不會發生,因爲你傳遞的是AutoMapper相關的魔法。這裏有一個簡單的解決方案,你必須映射之前強制執行:通過調用AsEnumerable()

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

[編輯]正如丹尼爾暗示的意見,你總是可以從IQueryableIEnumerable,仍然推遲執行:

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

使用'AsEnumerable()'而不是'ToList()'更好,因爲它仍然會執行延期執行。 –

+0

@DanielHilgarth非常真實,添加了編輯。 –

+1

這必須是我在網上遇到的最有趣的名字! –