Friday 15 August 2014

c# - How can I select a column within a dictionary value with nhibernate? -


मेरे पास इसके जैसा संरचना है:

  सार्वजनिक वर्ग की इकाई {सार्वजनिक इन्ट आईडी} ; सेट; } सार्वजनिक IDictionary & lt; स्ट्रिंग, EntityLocale & gt; लोकेलियां {प्राप्त करें; सेट; }} सार्वजनिक वर्ग EntityLocale {सार्वजनिक स्ट्रिंग नाम {get; सेट; }} पब्लिक क्लास EntityMap: ClassMap & lt; Entity & gt; {सार्वजनिक EntityMap () (HasMany (x = & gt; x.Locales)। आकृति & gt; स्ट्रिंग & gt; ("लोकेल")। घटक (सी = & gt; {। मैप (x = & gt; x.Name);}); }}   

और मैं "एन" कुंजी के साथ उत्पाद स्थान के सभी नामों को प्राप्त करना चाहता हूं। लिनक के साथ यह होगा:

  var नाम = सत्र.कॉलिकओवर & lt; उत्पाद & gt; ()। सूची ()। चुनें (x = & gt; x.locales ["en"]। नाम)। सूची बनाने के लिए();   

मैं इसे कैसे निहित कर सकता हूं? (मुझे कोई परवाह नहीं है कि यह QueryOver या Criteria api है, मैं सिर्फ सब कुछ नहीं चुनना चाहता हूँ)।

अपडेट

मैं निम्नलिखित बदसूरत हैक (जो मैं संतुष्ट नहीं हूं, मैं अपने कोड में कोई भी एसक्यूएल नहीं चाहता हूं):

  var नाम = सत्र। CreateSQLQuery ("चयन करें नाम से उत्पादकाले लोको लोकेल = 'एन' ")। सूची & lt; स्ट्रिंग & gt; ()    

इन मामलों के लिए, NHibernate बहुत अच्छा समाधान है: अंत में, हम उत्पाद का चयन करेंगे और शब्दकोश पर फ़िल्टर लागू करेंगे ... इसलिए केवल SingleOrDefault () आइटम में लोकल

  सार्वजनिक श्रेणी के कल्चरफ़िल्टर: फ़िल्टरडिफ़िनिशन {सार्वजनिक कल्चरफिल्टर () {withName ("CulturFilter")। एडेपैमेटर ("संस्कृति" , NHibernate.NHibernateUtil.String); }}   

और इसे लागू करें

  हैसमानी (x = & gt; x.Locales) .आममैप & lt; स्ट्रिंग & gt; ("लोकेल") ...। लागूफिल्टर & lt; CulturFilter & gt; ("लोकेल =: संस्कृति"));   

उस समय से, जब भी आप सत्र में फिल्टर को सक्षम करते हैं (यहां तक ​​कि कुछ एओपी फ़िल्टर के साथ), तो आप यह सुनिश्चित कर सकते हैं कि IDictionary में बिल्कुल एक (या कोई नहीं) तत्व .. <पूर्व> सत्र। सक्षमफ़िल्टर ("संस्कृतिफ़िल्टर") .सेटपरैमेरेटर ("संस्कृति", "एन"); // हर बार मान मानदंड = सत्र.क्रेट कट्रिएरिया ... var क्वेरी = सत्र.कॉन्टरवर ....

यदि आवश्यक हो तो कुछ और लिंक के साथ समान पद हैं < H3> संपादित करें: कॉलम "लोकेल" को सीधे नामों की सूची प्राप्त करना

अन्य दृष्टिकोण (वर्तमान समाधान को लगभग समान रखते हुए) जो कि इस्तेमाल किया जा सकता है (और मुझे पता है) LocalEntity का विस्तार करना है मैपिंग

  सार्वजनिक वर्ग EntityLocale {सार्वजनिक वर्चुअल स्ट्रिंग CultureName {get; सेट; } सार्वजनिक वर्चुअल स्ट्रिंग Name {get; सेट; }} पब्लिक क्लास EntityMap: ClassMap & lt; Entity & gt; {सार्वजनिक EntityMap () (HasMany (x = & gt; x.Locales)। आकृति & gt; स्ट्रिंग & gt; ("लोकेल")। घटक (सी = & gt; {सी। मैप (x = & gt; x.CultureName)। फोरमूला (" लोकेल ")। Not.Insert ()। Not.Update (); c.Map (x = & gt; x.Name);}); }}   

इसे होने से, हम सभी "एन" नामों की सूची इस तरह से प्राप्त कर सकते हैं:

  var मानदंड = सत्र.कॉलिकओवर & lt; इकाई & gt; ( ) .जोइन्टाइवरओवर & lt; IDictionary & lt; स्ट्रिंग, एंटिटीलोकेल & gt; & gt; (सी = & gt; c.Locales) .अनुक्रमित सीमेंट; Var list = मानदंड। जोड़ें (प्रतिबंधों। एईसी ("संस्कृतिनाम", "एन")) .प्रशासन (प्रोजेक्शंस। SQL प्रोजेक्शन ("नाम", नई स्ट्रिंग [] {"नाम"}, नए आईटीआईपी [] {NHibernateUtil.String} ))। लिस्ट () .स्टाङ & lt; स्ट्रिंग & gt; () .ओलिस्ट & lt; स्ट्रिंग & gt; ();   

अब हमारे पास एक सूची है जिसमें EntityLocale से "एन" संस्कृति द्वारा फ़िल्टर किए गए सभी नाम

No comments:

Post a Comment