2013-02-08 18 views
10

Zastanawiam się, czy jest coś, co mogę zrobić, aby działało zgodnie z oczekiwaniami. To działa dobrze w moim kodu:LINQ i 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; 

Ale zmienia to:

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

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

powoduje błąd nie widziałem przed:

„LINQ do podmiotów nie rozpoznaje metody Metoda "Security.Dto.RoleDto MapRole, RoleDto", a tej metody nie można przetłumaczyć na wyrażenie sklepu "

Nie jestem pewien, czy mogę zrobić coś z tym" problemem "... prawdopodobnie m Etoda, która działa, jest w każdym razie bardziej czytelna ...

Odpowiedz

21

Działasz pod numerem IQueryable, która próbuje przetłumaczyć metodę, którą podajesz na SQL. Oczywiście, to się nie stanie, ponieważ przekazujesz magię związaną z AutoMapper. Jest to proste rozwiązanie, trzeba wymusić wykonanie przed mapowaniem:

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

[edit] Jak Daniel sugeruje w komentarzach, zawsze można iść z IQueryable do IEnumerable wywołując AsEnumerable() i jeszcze odroczyć wykonanie:

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

Używanie 'AsEnumerable()' zamiast 'ToList()' jest lepsze, ponieważ nadal będzie wykonywać odroczone wykonanie. –

+0

@DanielHilgarth Bardzo prawdziwe, dodano edycję. –

+1

To musi być najzabawniejsza nazwa, z którą zetknąłem się online! –