मैं एक वस्तु ग्राफ है कि मैं एक डेटाबेस से लोड हो रहा है कर रहा हूँ है 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()?
पुल अनुरोध स्वीकार कर लिया गया था और परिवर्तन अब ऑटोमैपर 3 में है। –
मैं ऑटोमैपर 3.3.1 का उपयोग कर रहा हूं, यह ऑर्डरबी को मैपर कॉन्फ़िगरेशन में अनुमति देता है लेकिन यह वास्तव में आदेश नहीं देता है। डेटा सॉर्ट नहीं किया गया है और एसक्यूएल प्रोफाइलर जेनरेट एसक्यूएल में कोई ऑर्डर नहीं दिखाता है। मैं क्या खो रहा हूँ? – mendel
3.0 के बाद से एक बग पेश किया जा सकता है, या आपकी कॉन्फ़िगरेशन में कोई समस्या हो सकती है। एक [एमसीवीई] (http://stackoverflow.com/help/mcve) को एक नए प्रश्न के रूप में पोस्ट करें, यहां से लिंक करें, और मैं एक नज़र डालेगा? –