2013-02-08 14 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' विधि, और इस विधि एक दुकान अभिव्यक्ति "

में अनुवाद नहीं किया जा सकता है मुझे यकीन है कि अगर मैं भी this'problem के बारे में कुछ भी कर सकते नहीं कर रहा हूँ '... यकीनन मीटर जिस तरह से काम करता है वैसे भी अधिक पठनीय है ...

उत्तर

21

आप IQueryable पर काम कर रहे हैं, जो SQL में आपूर्ति की गई विधि का अनुवाद करने का प्रयास करता है। जाहिर है, ऐसा नहीं होने वाला है, क्योंकि आप ऑटोमैपर से संबंधित जादू को पार कर रहे हैं। AsEnumerable() फोन करके

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

[संपादित करें] डैनियल टिप्पणी में पता चलता है, तो आप हमेशा IEnumerable को IQueryable से जा सकते हैं और अभी भी निष्पादन स्थगित:

return roles.AsEnumerable().Select(role => Mapper.Map<Role, RoleDto>(role)).ToList(); 
वहाँ एक आसान समाधान है, आप मानचित्रण से पहले निष्पादन के लिए मजबूर करने के लिए है
+11

'ToList()' के बजाय 'AsEnumerable() 'का उपयोग करना बेहतर है क्योंकि यह अभी भी स्थगित निष्पादन निष्पादित करेगा। –

+0

@DanielHilgarth बहुत सच, संपादन जोड़ा। –

+1

यह सबसे मजेदार नाम होना चाहिए जो मैंने ऑनलाइन भर दिया है! –

संबंधित मुद्दे