2013-02-14 9 views
14

मैं एक वस्तु ग्राफ है कि मैं एक डेटाबेस से लोड हो रहा है कर रहा हूँ है DTOs में एफई CodeFirst और AutoMapper का उपयोग कर छँटाई: -।AutoMapper परियोजना() के लिए() और एक बच्चे संग्रह

public class Foo 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Bar> Bars { get; set; } 
} 

public class Bar 
{ 
    public int Id { get; set; } 
    public int FooId { get; set; } 
    public virtual Foo Foo { get; set; } 

    public string Name { get; set; } 
    public int SortOrder { get; set; } 
} 

public class FooDto 
{ 
    public IEnumerable<BarDto> Bars { get; set; } 
} 

public class BarDto 
{ 
    public string Name { get; set; } 
    public int SortOrder { get; set; } 
} 

मेरे मैपिंग की तरह लग रहे: -

mapper.CreateMap<Foo, FooDto>(); 
mapper.CreateMap<Bar, BarDto>(); 

अभी तक, बहुत अच्छा है। मैं अच्छी तरह से मेरे संदर्भ और डीटीओ से परियोजना संस्थाओं हड़पने कर सकते हैं: -

var foos = context.Foos.Project().To<FooDto>(); 

क्या मैं इस दृष्टिकोण के साथ ऐसा नहीं कर सकते, फिर भी, तरह उनके SortOrder IQueryable अंदर से Bars है।

अगर मैं कोशिश: -

mapper.CreateMap<Foo, FooDto>() 
    .ForMember(
    x => x.Bars 
    opt => opt.MapFrom(src => src.Bars.OrderBy(x => x.SortOrder))); 
mapper.CreateMap<Bar, BarDto>(); 
var foos = context.Foos.Project().To<FooDto>(); 

मैं एक अपवाद प्राप्त: -

System.InvalidOperationException: Sequence contains no elements 
    at System.Linq.Enumerable.First[TSource](IEnumerable`1 source) 
    at AutoMapper.MappingEngine.CreateMapExpression(Type typeIn, Type typeOut) 
    ... 

लगता है इस https://github.com/AutoMapper/AutoMapper/issues/159 से संबंधित है - हालांकि मैं पहले से ही बच्चे को संग्रह के लिए एक जटिल प्रकार उपयोग कर रहा हूँ। मुझे लगता है कि CreateMapExpression बाल संग्रह पर ऑर्डरबी का समर्थन नहीं करता है?

मैं .Project() का उपयोग नहीं कर रहा हूँ, तो करने के लिए() तो मैं बच्चा संग्रह आसानी से क्रमबद्ध कर सकते हैं: -।

var model = context.Foos.Select(x => new FooDto() 
{ 
    Bars = x.Bars.OrderBy(y => y.SortOrder) 
}); 

लेकिन फिर मैं मानचित्रण को दोहराने के लिए जहाँ भी मैं इसे उपयोग करना चाहते हैं, ऑटोमैपर का उपयोग करने के उद्देश्य को हराया।

मजे की बात है

: -

1) मैं बच्चे के संग्रह पर अन्य (अधिक जटिल) कार्रवाई करने और कोई समस्या नहीं मेरी माँ बाप डीटीओ में उन समतल कर सकते हैं: -?

mapper.CreateMap<Foo, FooDto>() 
    .ForMember(
    x => x.AllBarsHaveAName, 
    opt => opt.MapFrom(src => 
     src.Bars.All(x => x.Name != null))); 

2) मैं Mapper.Map<FooDto>(foo); स्मृति में बस ठीक है, और यह सलाखों को कोई समस्या नहीं हल करेगा।

अभी भी उपयोग करते समय IQueryable स्तर पर बाल संग्रह को सॉर्ट करना संभव है। प्रोजेक्ट()। To()?

उत्तर

11

इस परिदृश्य का समर्थन करने के AutoMapper स्रोत कोड को संशोधित समाप्त हो गया।उम्मीद है कि प्रस्तावित ठीक स्वीकार किया जाएगा, लेकिन इस बीच आप पर विवरण देख सकते हैं: -

https://github.com/AutoMapper/AutoMapper/pull/327

+1

पुल अनुरोध स्वीकार कर लिया गया था और परिवर्तन अब ऑटोमैपर 3 में है। –

+0

मैं ऑटोमैपर 3.3.1 का उपयोग कर रहा हूं, यह ऑर्डरबी को मैपर कॉन्फ़िगरेशन में अनुमति देता है लेकिन यह वास्तव में आदेश नहीं देता है। डेटा सॉर्ट नहीं किया गया है और एसक्यूएल प्रोफाइलर जेनरेट एसक्यूएल में कोई ऑर्डर नहीं दिखाता है। मैं क्या खो रहा हूँ? – mendel

+0

3.0 के बाद से एक बग पेश किया जा सकता है, या आपकी कॉन्फ़िगरेशन में कोई समस्या हो सकती है। एक [एमसीवीई] (http://stackoverflow.com/help/mcve) को एक नए प्रश्न के रूप में पोस्ट करें, यहां से लिंक करें, और मैं एक नज़र डालेगा? –

0

मुझे आश्चर्य है कि मैपिंग के दौरान क्वेरी के अंदर बार्स को सॉर्ट करना यह करने का सबसे अच्छा स्थान है? मानचित्र में इस प्रकार को रखने का मतलब यह नहीं है कि यह अनुचित समय पर है?

उदाहरण के लिए, यदि आप बस जानना चाहते हैं कि बार्स संग्रह में 1 आइटम है या नहीं? कॉलिंग FooDto.Bars.Any() अभी भी डेटाबेस में एक प्रकार का परिणाम होगा।

शायद यह बेहतर हो कि इस तरह दिखता है FooDTO (मानचित्रण में नजरअंदाज) में एक और संपत्ति के लिए होगा:

public IEnumerable<BarDto> SortedBars 
    { 
     get 
     { 
      if (Bars == null) 
       return null; 

      return Bars.OrderBy(x => x.SortOrder).ToList(); 
     } 
    } 
+0

मुझे लगता है कि आप संभावित रूप से उपयोग कर सकता है AutoMapper की मैपिंग विन्यास सामान अपने छंटाई करने के लिए पर "AfterMap" विधि ? –

+0

कॉलिन: मुझे पूरा डीटीओ खींचने की संभावना नहीं है कि यह देखने के लिए कि FooDto.Bars.Any() - यह एक विशिष्ट दृश्य के लिए एक विशिष्ट क्वेरी है। –

+0

रिचर्ड बी: मैंने आफ्टर मैप को देखा, और यह एक काम के बाद जॉब (कॉलिन की "सॉर्टेडबर्स" संपत्ति के रूप में) करेगा, लेकिन प्रोफाइलिंग होने पर मैं पसंद करूंगा कि यह डेटाबेस डेटाबेस पर होता है जैसा कि मैं करता हूं चयन करें (x => नया FooDto ...) –

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