दिलचस्प पोस्ट
हस्केल के स्नैप और हूसेड वेब फ्रेमवर्क की तुलना करना संरचना के रूप में संपत्ति को असाइन नहीं किया जा सकता है पायथन में MySQL में सीएसवी डेटा लोड करें पंडों read_sql पैरामीटर के साथ विस्टा (.नेट) में ऊंचा नहीं कैसे चलाना HTML इनपुट एरेज़ जावा प्रभाव कचरा संग्रह में रिक्त स्थान को बताएगा? ITunes स्टोर पर अपलोड करने में एक त्रुटि हुई पुनरावृत्तियों के बिना यादृच्छिक संख्या उत्पन्न करना जेपीए और मानदंड एपीआई – केवल विशिष्ट कॉलम का चयन करें लोकप्रिय ब्राउज़र में कितने समवर्ती AJAX (XmlHttpRequest) अनुरोधों की अनुमति है? क्या यह एक ही थ्रेड पर दो बार प्रारंभ विधि को कॉल करने के लिए कानूनी है? वेब फॉन्ट लोड होने पर एक बार अधिसूचित कैसे किया जाए NSMutableArray addObject: – : अपरिचित चयनकर्ता को उदाहरण के लिए भेजा गया एक्सएचटीएमएल / सीएसएस: आंतरिक डिवाइंड को 100% चौड़ाई घटाकर दूसरे डिवा चौड़ाई कैसे बनाया जाए

क्या ऑटोमैपर लिंक का समर्थन करता है?

मैं लंका लोड सुविधा के साथ लिनक में एसक्यूएल में बहुत दिलचस्पी रहा हूँ। और मेरी परियोजना में मैंने DB_RoleInfo मॉडल को डोमेन मॉडल में DB_RoleInfo करने के लिए DO_RoleInfo इस्तेमाल किया ( DB_RoleInfo से DO_RoleInfo )। मेरे रिपॉज़िटरी कोड में नीचे दिए गए हैं:

  public DO_RoleInfo SelectByKey(Guid Key) { return SelectAll().Where(x => x.Id == Key).SingleOrDefault(); } public IQueryable<DO_RoleInfo> SelectAll() { Mapper.CreateMap<DB_RoleInfo, DO_RoleInfo>(); return from role in _ctx.DB_RoleInfo select Mapper.Map<DB_RoleInfo, DO_RoleInfo>(role); } 

SelectAll विधि ठीक से चल रही है, लेकिन जब मैं SelectByKey कॉल करता SelectByKey , मुझे त्रुटि मिलती है:

विधि "RealMVC.Data.DO_RoleInfo MapDB_RoleInfo, DO_RoleInfo" एसक्यूएल में अनुवाद नहीं कर सका

क्या यह है कि Automapper पूरी तरह Linq का समर्थन नहीं करता है?

ऑटोमैपर के बजाय, मैंने नीचे मैन्युअल मानचित्रण कोड की कोशिश की:

 public IQueryable<DO_RoleInfo> SelectAll() { return from role in _ctx.DB_RoleInfo select new DO_RoleInfo { Id = role.id, name = role.name, code = role.code }; } 

यह विधि जिस तरीके से मैं चाहता हूँ वह काम करता है

Solutions Collecting From Web of "क्या ऑटोमैपर लिंक का समर्थन करता है?"

जबकि @ एरोनाइट का जवाब लेखन के समय सही था, क्योंकि अक्सर दुनिया बदल गई है और इसके साथ ऑटोमैपर। मतलब समय में, QueryableExtensions को कोड बेस में जोड़ दिया गया था जिसने उन अनुमानों के लिए समर्थन जोड़ा गया जो अभिव्यक्ति में अनुवादित हो गए और, आखिरकार, एसक्यूएल।

कोर एक्सटेंशन विधि ProjectTo 1 है आपका कोड ऐसा दिख सकता है:

 using AutoMapper.QueryableExtensions; public IQueryable<DO_RoleInfo> SelectAll() { Mapper.CreateMap<DB_RoleInfo, DO_RoleInfo>(); return _ctx.DB_RoleInfo.ProjectTo<DO_RoleInfo>(); } 

और यह मैनुअल मानचित्रण की तरह व्यवहार करेगा ( CreateMap स्टेटमेंट यहां प्रदर्शन प्रयोजनों के लिए है। आम तौर पर, आप एप्लिकेशन स्टार्टअप पर मैपिंग को परिभाषित करते हैं)।

इस प्रकार, मानचित्रण के लिए आवश्यक केवल कॉलम ही पूछे जाते हैं और परिणाम एक IQueryable जो अभी भी मूल क्वेरी प्रदाता (linq-to-sql, linq-to-entity, whatever) है। तो यह अभी भी संमिश्र है और यह एसक्यूएल में एक WHERE खंड में अनुवाद करेगा:

 SelectAll().Where(x => x.Id == Key).SingleOrDefault(); 

1 Project().To<T>() से पहले Project().To<T>() v। 4.1.0 से पहले

अपनी दूसरी फ़ंक्शन को इस पर बदलें:

 public IEnumerable<DO_RoleInfo> SelectAll() { Mapper.CreateMap<DB_RoleInfo, DO_RoleInfo>(); return from role in _ctx.DB_RoleInfo.ToList() select Mapper.Map<DB_RoleInfo, DO_RoleInfo>(role); } 

ऑटोमैपर Linq से SQL के साथ ठीक काम करता है, लेकिन इसे आस्थगित क्वेरी के भाग के रूप में निष्पादित नहीं किया जा सकता है। अपनी लिंक क्वेरी के अंत में ToList() को जोड़ने से क्वेरी का एक भाग के रूप में ऑटोमैपर सेगमेंट का अनुवाद करने की कोशिश करने के बजाय परिणामों का तुरंत मूल्यांकन करने का कारण होता है।


स्पष्टीकरण

स्थगित निष्पादन की धारणा ("आलसी लोड") की कोई धारणा नहीं है, एक बार जब आप परिणामी प्रकार को किसी ऐसी वस्तु में बदल देते हैं जो किसी डेटा इकाई नहीं है। इन दो वर्गों पर विचार करें:

 public class DB_RoleInfo { public int ID { get; set; } public string Name { get; set; } } public class DO_RoleInfo { public Role Role { get; set; } // Enumeration type } 

अब निम्नलिखित मानचित्रण पर विचार करें:

 Mapper.CreateMap<DB_RoleInfo, DO_RoleInfo> .ForMember(dest => dest.Role, opt => opt.MapFrom(src => (Role)Enum.Parse(typeof(Role), src.Name))); 

यह मैपिंग पूरी तरह से ठीक है (जब तक कि मैं कोई टाइपो नहीं करता), लेकिन हम कहते हैं कि आप मेरे संशोधित एक के बजाय अपने मूल पोस्ट में SelectAll विधि लिखते हैं:

 public IQueryable<DO_RoleInfo> SelectAll() { Mapper.CreateMap<DB_RoleInfo, DO_RoleInfo>(); return from role in _ctx.DB_RoleInfo select Mapper.Map<DB_RoleInfo, DO_RoleInfo>(role); } 

यह वास्तव में काम करता है, लेकिन खुद को "क्वेरी" कह कर, यह झूठ है अगर मैं इसके खिलाफ यह लिखने की कोशिश करता हूं तो क्या होगा:

 public IEnumerable<DO_RoleInfo> SelectSome() { return from ri in SelectAll() where (ri.Role == Role.Administrator) || (ri.Role == Role.Executive) select ri; } 

इस बारे में वास्तव में कठिन सोचें कैसे Linq को SQL संभवतः सफलतापूर्वक एक वास्तविक डेटाबेस क्वेरी में आपके where को कैसे चालू कर सकता है?

Linq DO_RoleInfo वर्ग के बारे में कुछ नहीं जानता है यह मैपिंग पिछड़े करने के बारे में नहीं जानता – कुछ मामलों में, यह संभव नहीं हो सकता है बेशक, आप इस कोड को देख सकते हैं और "ओह, यह आसान है, बस 'व्यवस्थापक' या 'एक्जीक्यूटिव' Name कॉलम में खोजें , लेकिन आप केवल एक ही व्यक्ति हैं जो यह जानता है। जहां तक ​​Linq to SQL का संबंध है, क्वेरी शुद्ध बकवास है।

कल्पना कीजिए कि कोई आपको ये निर्देश देता है:

सुपरमार्केट पर जाएं और मॉर्टन थॉम्पसन तुर्की बनाने के लिए सामग्री वापस लाएं।

जब तक आप इसे पहले नहीं बना लेते हैं, और अधिकांश लोगों के पास नहीं है, तो उस अनुदेश पर आपकी प्रतिक्रिया सबसे अधिक होने की संभावना है:

  • आख़िर ये बला है क्या?

आप बाजार में जा सकते हैं, और आप विशिष्ट सामग्री को नाम से प्राप्त कर सकते हैं, लेकिन आप उस स्थिति का मूल्यांकन नहीं कर सकते जो मैंने आपको दिया है जब आप वहां रहे हैं । मुझे मापदंड पहले "अन-नक्शा" करना होगा मुझे आपको यह बताना होगा, इस नुस्खा के लिए हमारे यहां आवश्यक तत्व हैं – अब जाओ और उन्हें मिलें।


संक्षेप में, यह Linq से SQL और AutoMapper के बीच कुछ सरल असंगति नहीं है यह उन दो पुस्तकालयों में से किसी एक के लिए अद्वितीय नहीं है इससे कोई फर्क नहीं पड़ता कि आप वास्तव में किसी गैर-इकाई प्रकार के मानचित्रण को कैसे करते हैं – आप मैपिंग को मैन्युअल रूप से आसानी से कर सकते हैं, और आप अभी भी एक ही त्रुटि प्राप्त कर सकते हैं, क्योंकि अब आप लिनक को निर्देशों का एक सेट एसक्यूएल दे रहे हैं जो अब समझने योग्य नहीं हैं, रहस्यमय वर्गों से निपटने के लिए किसी विशेष इकाई के प्रकार के लिए एक आंतरिक मैपिंग नहीं है।

यह समस्या ओ / आर मानचित्रण और स्थगित क्वेरी निष्पादन की अवधारणा के लिए मौलिक है। एक प्रक्षेपण एक-तरफ़ा ऑपरेशन है । एक बार जब आप प्रोजेक्ट करते हैं, तो आप क्वेरी इंजिन पर वापस नहीं जा सकते हैं और ओह कह सकते हैं, यहां आपके लिए कुछ और शर्तें हैं । बहुत देर हो चुकी है। सबसे अच्छा आप कर सकते हैं वह ले लेते हैं जो आपको पहले से ही दे चुका है और अतिरिक्त शर्तों का मूल्यांकन स्वयं करता है।


अंतिम लेकिन कम से कम नहीं, मैं आपको एक वैकल्पिक हल के साथ छोड़ दूँगा यदि आप अपने मैपिंग से केवल एक ही चीज़ करने में सक्षम होना चाहते हैं तो पंक्तियों को फ़िल्टर करना है, आप इसे लिख सकते हैं:

 public IEnumerable<DO_RoleInfo> SelectRoles(Func<DB_RoleInfo, bool> selector) { Mapper.CreateMap<DB_RoleInfo, DO_RoleInfo>(); return _ctx.DB_RoleInfo .Where(selector) .Select(dbr => Mapper.Map<DB_RoleInfo, DO_RoleInfo>(dbr)); } 

यह एक उपयोगिता पद्धति है जो आपके लिए मैपिंग को संभालती है और मूल इकाई पर एक फिल्टर स्वीकार करती है, और मैप इकाई नहीं। यह उपयोगी हो सकता है अगर आपके पास कई अलग-अलग प्रकार के फिल्टर होते हैं लेकिन हमेशा एक ही मानचित्रण करने की आवश्यकता होती है

निजी तौर पर, मुझे लगता है कि आप बेहतर तरीके से प्रश्नों को ठीक से लिख रहे होंगे, पहले यह तय करेंगे कि आपको डेटाबेस से पुनर्प्राप्त करने की आवश्यकता है, फिर कोई भी अनुमान / मैपिंग कर रहा है, और फिर अंत में, अगर आपको आगे फ़िल्टर करने की आवश्यकता है नहीं होना चाहिए), फिर परिणामों को ToList() या ToArray() साथ ToList() ToArray() और स्थानीय सूची के विरुद्ध और शर्तें लिखें।

Linq से SQL के संपर्क में आने वाली वास्तविक संस्थाओं को छुपाने के लिए ऑटोमैपर या अन्य उपकरण का उपयोग करने का प्रयास न करें। डोमेन मॉडल आपका सार्वजनिक इंटरफ़ेस है । आपके द्वारा लिखी जाने वाली क्वेरी आपके निजी कार्यान्वयन का एक पहलू है अंतर को समझना और चिंताओं का एक अच्छा पृथक्करण बनाए रखना महत्वपूर्ण है।