2010-09-05 27 views
5

में दोहराया प्रक्षेपण कोड से बचना मैं एक समस्या यहाँइकाई की रूपरेखा

Initializing strongly typed objects in LINQ to Entities

केवल पूरी तरह से विपरीत दिशा से वर्णित एक के समान हल करने के लिए कोशिश कर रहा हूँ। मेरे पास मेरे भंडार में कई कार्य हैं, जिनमें से सभी समान आकार के डेटा लौटते हैं। पल यह भंडार में प्रत्येक प्रश्न के लिए मौजूद है पर

select new pocoClass 
{ 
    // complex projection that is several pages long includes grabbing a graph of data 
} 

: मुद्दा मेरी प्रक्षेपण कोड है। मैं इसे ऑब्जेक्ट स्टार्टिज़र में ले जाने की कोशिश करता था, लेकिन इससे मुझे डरावना "केवल पैरामीटर रहित कन्स्ट्रक्टर और प्रारंभकर्ताओं को LINQ से इकाइयों में समर्थित किया जाता है।" मुद्दा।

मैं दो प्रश्नों

var candidates = (from thing in _entities.whatever 
    where (complex.stuff==true) 
    select thing); 

var final = (from thing in candidates.AsEnumerable() 
    let x = thing.ITEMS.Where(blah=>blah.blah==param) 
    let y = x.OTHERITEMS.FirstOrDefault() 
    select new pocoClass(thing,x,y); 

लेकिन यहां फाइनल में बंटवारे की कोशिश हमेशा रिक्त है और नए pocoClass में कोड कभी नहीं कहा जाता है किया है। मैंने उपरोक्त में चलो x & वाई शामिल किया है क्योंकि ये हमेशा प्रक्षेपण के प्रत्येक उपयोग के बीच भिन्न होते हैं।

तो, क्या मुझे अपने प्रक्षेपण की कई प्रतियों पर वापस जाना है या क्या इससे कोई दूसरा तरीका है?

उत्तर

12

मुझे यकीन नहीं है कि यह आपके लिए उपयोग योग्य है, लेकिन मैं अक्सर जो करता हूं वह प्रोजेक्शन विधियां बनाता है जो IQueryable लेते हैं और एक डोमेन ऑब्जेक्ट से डीटीओ में अनुवाद करने के लिए IQueryable लौटाते हैं। वे इस तरह ज्यादा लग रही है:

public static IQueryable<CustomerDTO> ToCustomerDTO(
    IQueryable<Customer> customers) 
{ 
    return 
     from customer in customers 
     select new CustomerDTO() 
     { 
      ... 
     }; 
} 

यह एक ही स्थान में इस प्रक्षेपण की अनुमति देता है मुझे। मेरी व्यावसायिक परत में कई स्थानों से मैं इस तरह की एक विधि कहता हूं।

कुछ बातों का ध्यान रखना है, हालांकि इस प्रकार हैं:

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

मुझे आशा है कि इस मदद करता है।

+0

लगभग - अपने व्यापार तर्क मुद्दा - मेरी उदाहरण में लेट बयान जो प्रत्येक ग्राहक प्रक्षेपण से पहले के लिए मूल्यांकन किया जाता है। – Andiih

+0

असल में मुझे समाधान देने के लिए पर्याप्त है। मैंने एक नया सरलीकृत डीटीओ इंटरमीडिएट क्लास बनाया है जिसे मैं केवल आधा दर्जन मानों की प्रतिलिपि बनाकर प्रोजेक्ट कर सकता हूं: प्रत्येक एक पूर्ण ईएफ इकाई है। फिर मैं उन इकाइयों से अंतिम प्रक्षेपण करने के लिए आपके समाधान का उपयोग करता हूं। यकीन नहीं है कि यह कैसे करेगा, लेकिन यह निश्चित रूप से neater! – Andiih

+0

@Andiih: पृष्ठभूमि में कितने प्रश्न निष्पादित किए गए हैं, यह देखने के लिए आपको SQL प्रोफाइलर का उपयोग करना होगा। एक अच्छा बदलाव है कि ईएफ कवर के पीछे कई प्रश्न निष्पादित करेगा। प्रौद्योगिकी-पाठ्यक्रम- इसकी सीमाएं हैं। यदि आप प्रदर्शन से खुश नहीं हैं और इस बारे में कोई जानकारी नहीं है कि इसे एक ही प्रश्न में कैसे प्राप्त किया जाए, तो शायद मैं इसके साथ आपकी सहायता कर सकता हूं। उस स्थिति में, SO पर एक नया प्रश्न यहां शुरू करें और यहां एक लिंक छोड़ दें।चियर्स – Steven

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