2013-02-08 15 views
10

Bu çalışmayı beklendiği gibi almak için yapabileceğim bir şey olup olmadığını merak ediyorum. Bu benim kodunda çalışıyor:LINQ ve 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; 

Ama bu değişen:

"varlıkları için LINQ yöntemini tanımıyor: hatayla

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

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

Sonuçlar daha önce görmedim 'Security.Dto.RoleDto MapRole, RoleDto' yöntemi ve bu yöntem, bir mağaza ifadesine dönüştürülemez "

Bu sorun hakkında bir şey yapıp yapamayacağımı bile bilmiyorum." Çalıştığınız ethod daha fazla okunabilir ...

cevap

21

IQueryable üzerinde çalışıyorsunuz, bu SQL'e sağladığınız yöntemi çevirmeye çalışır. Açıkçası, AutoMapper ile ilgili sihri geçerken, bu olmayacak. AsEnumerable() arayarak

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

[DÜZENLE] Daniel yorumlarda da anlaşılacağı gibi, her zaman IEnumerable için IQueryable den gidebilir ve hala yürütme ertelemek:

return roles.AsEnumerable().Select(role => Mapper.Map<Role, RoleDto>(role)).ToList(); 
kolay bir çözüm yoktur, sen haritalama önce yürütülmesine zorlamak zorunda
+11

'ToList()' yerine 'AsEnumerable()' işlevini kullanmak, hala ertelenmiş yürütmeyi gerçekleştireceğinden daha iyidir. –

+0

@DanielHilgarth Çok doğru, düzenlemeyi ekledi. –

+1

Bu, çevrimiçi karşılaştığım en komik isim olmalı! –