2011-08-29 15 views
5

मैंने हाल ही में डैपर को ईएफ के संभावित प्रतिस्थापन के रूप में मूल्यांकन करना शुरू कर दिया है, क्योंकि मैं उत्पन्न होने वाले एसक्यूएल से बहुत खुश नहीं था और उस पर अधिक नियंत्रण चाहता था। मेरे डोमेन मॉडल में एक जटिल वस्तु मैपिंग के संबंध में मेरे पास एक प्रश्न है। आइए मान लें कि मेरे पास प्रदाता नामक एक ऑब्जेक्ट है, प्रदाता में आईन्यूमेरेबल प्रकार के कई गुण हो सकते हैं जिन्हें केवल मूल प्रदाता ऑब्जेक्ट (यानी कुल रूट) से जाकर एक्सेस किया जाना चाहिए। मैंने समान पदों को देखा है जिन्होंने QueryMultiple और एक मानचित्र एक्सटेंशन विधि का उपयोग करके समझाया है, लेकिन यह सोच रहा था कि अगर मैं एक ऐसी विधि लिखना चाहता हूं जो पूरे ऑब्जेक्ट ग्राफ को वापस लोड कर दे, तो डैपर एक में ऐसा करने में सक्षम होगा, या अगर इसे टुकड़ा-भोजन करने की आवश्यकता होती है।डैपर सही ऑब्जेक्ट/कुल मैपिंग

public AggregateRoot 
     { 
      public int Id {get;set;} 
      ...//simple properties 
      public IEnumerable<Foo> Foos 
      public IEnumerable<Bar> Bars 
      public IEnumerable<FooBar> FooBars 
      public SomeOtherEntity Entity 
      ... 
     } 

वहाँ डैप्पर का उपयोग कर संपूर्ण वस्तु ग्राफ को आबाद करने का एक सरल तरीका है: एक उदाहरण का कहना है कि मेरी वस्तु निम्नलिखित की तरह कुछ देखा की सुविधा देता है के रूप में?

+0

आपको इसके लिए कुछ मैन्युअल एक्सटेंशन बनाना होगा, ग्राफ डिस्कवरी और स्वचालित एसक्यूएल पीढ़ी –

+0

के लिए कोई अंतर्निहित विधि नहीं है, आपकी प्रतिक्रिया सैम के लिए धन्यवाद, एक समाधान के बारे में जो स्वचालित नहीं है बल्कि SQL का उपयोग करता है क्वेरी? क्या यह संभव है? इसके अतिरिक्त, एसओ पर यह कैसे संभाला जाता है अगर बिल्कुल? या इस प्रकार और जटिलता के संबंधों को संभालने के लिए अलग-अलग प्रश्न उत्पन्न किए जा रहे हैं? – mreyeros

+0

शुभ दोपहर सैम, बस एक और त्वरित सवाल मैंने देखा कि क्वेरी विधि में मैं विधि ओवरलोड में से किसी एक का उपयोग करके 5 ऑब्जेक्ट्स तक पास कर सकता हूं। क्या इस विधि का उपयोग मैं जो करने की कोशिश कर रहा हूं उसे उत्पन्न करने के लिए किया जा सकता है, या क्या मैं इसके उपयोग को गलत समझ रहा हूं? – mreyeros

उत्तर

7

मेरे पास एक समान स्थिति है। मैंने अपना एसक्यूएल फ्लैट वापस कर दिया, ताकि सभी उप वस्तुएं वापस आ सकें। फिर मैं पूर्ण सेट को मैप करने के लिए क्वेरी <> का उपयोग करता हूं। मुझे यकीन नहीं है कि आपके सेट कितने बड़े हैं।

तो कुछ इस तरह:

var cnn = sqlconnection(); 

var results = cnn.Query<AggregateRoot,Foo,Bars,FooBar,someOtherEntity,AggregateRoot>("sqlsomething" 
       (ar,f,b,fb,soe)=>{ 
        ar.Foo = f; 
        ar.Bars = b; 
        ar.FooBar = fb; 
        ar.someotherentity = soe; 
        return ar; 

       },.....,spliton:"").FirstOrDefault(); 

तो क्वेरी टैग में पिछले वस्तु वापसी वस्तु है। स्प्लिटऑन के लिए, आपको एक फ्लैट सरणी के रूप में वापसी के बारे में सोचना होगा कि मैपिंग हालांकि चलती है। आप प्रत्येक नई ऑब्जेक्ट के लिए पहला रिटर्न वैल्यू लेंगे ताकि नया मैपिंग वहां से शुरू हो सके।

उदाहरण:

select ID,fooid, foo1,foo2,BarName,barsomething,foobarid foobaritem1,foobaritem2 from blah 

spliton होगा "आईडी, fooid, BarName, foobarid"। चूंकि यह रिटर्न सेट पर दौड़ गया, यह उन गुणों को मैप करेगा जो इसे प्रत्येक ऑब्जेक्ट में पा सकते हैं।

मुझे उम्मीद है कि इससे मदद मिलती है, और यह कि आपका रिटर्न सेट फ्लैट लौटने के लिए बहुत बड़ा नहीं है।

+0

उत्कृष्ट Arnej65, जो निश्चित रूप से मुझे एक बड़ा सौदा करने में मदद करेगा। – mreyeros

+0

क्या यह भी संभव है जब क्वेरी संग्रहीत प्रक्रिया में हो (इसलिए आप मूल रूप से संग्रहीत प्रक्रिया को तर्क से गुजरते हैं)? –

+1

@ क्रिज़िट्टोफ्रानिकी हां। मेरे मामले में मैंने उन प्रक्रियाओं को संग्रहित किया था जो आवश्यक सभी डेटा पूछे गए थे, और एक फ्लैट आउटपुट में लौट आए थे। – Arnej65

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