2012-03-27 11 views
9

मैंने एएसपी.नेट वेब एपीआई के साथ एक अच्छा छोटा एपीआई बनाया, लेकिन मुझे लगता है कि इकाइयों को मेरे संदर्भ (इकाई ढांचे) से वापस करने का अधिकार नहीं है, इसलिए मैं डीटीओ ऑब्जेक्ट्स में सबकुछ मैप कर रहा हूं।एएसपी.नेट वेब एपीआई वापसी योग्य डीटीओ?

जो मुझे समझ में नहीं आता है हालांकि: मैं अपना संदर्भ क्वेरी करने योग्य कैसे रख सकता हूं, लेकिन फिर भी केवल संस्थाओं के बजाय डीटीओ वापस कर सकता हूं? या यह संभव नहीं है?

public IQueryable<ItemDto> Get() 
{ 
    using (EfContext context = new EfContext()) 
    { 
     Mapper.CreateMap<Item, ItemDto>() 
      .ForMember(itemDto => itemDto.Category, mce => mce.MapFrom(item => item.Category.Name)); 

     IEnumerable<ItemDto> data = Mapper.Map<IEnumerable<Item>, IEnumerable<ItemDto>>(context.Items 
      .OrderByDescending(x => x.PubDate) 
      .Take(20)); 

     return data.AsQueryable(); 
    } 
} 

आप मैं डेटा लोड देख सकते हैं, और बनाने है कि छोटी IEnumerable संग्रह queryable के रूप में:

यह मेरा कोड है। समस्या यह है कि कोड के इस टुकड़े के लिए जेनरेट की गई क्वेरी शायद काफी अक्षम है क्योंकि यह पहले सभी आइटम लोड करती है (या कम से कम 20 पहले आइटम) और फिर आउटपुट फ़िल्टर करती है।

मुझे आशा है कि मैंने अपनी समस्या को जितना संभव हो उतना अच्छा बताया है, यह समझाने में थोड़ा मुश्किल है। मुझे Google पर इसके बारे में कुछ भी नहीं मिला।

+0

वेब एपीआई एंडपॉइंट्स को IQueryable के रूप में बेनकाब न करें ... यदि आपको वास्तव में इसकी आवश्यकता है, तो वेब एपीआई ओडाटा के साथ जाएं। अन्यथा, बस सादे पुराने आरईएसटी एंडपॉइंट्स के साथ चिपके रहें और अपने नियंत्रक कार्यों पर पैरामीटर के रूप में किसी भी तरह के फ़िल्टरिंग को बेनकाब करें। – mare

उत्तर

7

पहले स्मृति में सबकुछ का चयन न करें। कुछ इस तरह है:

public IQueryable<ItemDto> Get() 
{ 
    using (EfContext context = new EfContext()) 
    { 
     var query = from item in context.Items 
        select Mapper.Map<Item, ItemDto>(item) 

     return query.OrderByDescending(x => x.PubDate).Take(20)); 
    } 
} 

BTW निम्नलिखित कोड कुछ आप एक स्थिर निर्माता में या WebApiConfig.cs फ़ाइल में उदाहरण के लिए, एक बार क्या करना चाहते है।

Mapper.CreateMap<Item, ItemDto>() 
    .ForMember(itemDto => itemDto.Category, mce => mce.MapFrom(item => item.Category.Name)); 
+0

क्या यह ईएफ 4 में काम करता है? सबसे अच्छा मुझे याद है, ईएफ ने आपको ऐसे प्रकारों पर नक्शा नहीं दिया जो ईएफ में परिभाषित नहीं थे। –

+0

तो मुझे केवल एप्लिकेशन स्टार्टअप पर एक बार मेरे मैपिंग को परिभाषित करना होगा? उसे नहीं पता था। इसे इंगित करने के लिए धन्यवाद :) –

+0

@Ryan। ईएफ पूछताछ में आप ईएफ इकाइयों को पुनः प्राप्त कर रहे हैं, केवल लोड किए गए लोग ऑटोमैपर का उपयोग कर डीटीओ में परिवर्तित हो जाते हैं। लेकिन इस तरह आप आलसी लोडिंग प्राप्त करते हैं ताकि डेटाबेस में ऑर्डर/फ़िल्टर किया जा सके और केवल अधिकतम 20 रिकॉर्ड ईएफ इकाइयों से डीटीओ तक मैप किए गए हों। – Maurice

3

यदि कोड में एकमात्र पूछताछ होती है तो हम देखते हैं (यानी ऑर्डरिंग और टेक) आपका कोड ठीक है। यह केवल परिणाम मैप करेगा (अधिकतम 20)। हालांकि, चूंकि आप IQueryable लौट रहे हैं, मुझे लगता है कि आप परिणाम आगे पूछना चाहते हैं। ओडाटा शैली पैरामीटर हो सकता है?

अधिकतम 20 आइटम के साथ आप शायद किसी भी कोड को लिखने से बेहतर नहीं हैं। शेष प्रश्न ऑब्जेक्ट प्रश्नों के रूप में किए जाएंगे। हालांकि, अगर आप उस बाधा को दूर करने का निर्णय लेते हैं (अधिकतम 20) या आगे के प्रश्न पूछने के बाद यह सुनिश्चित करें कि इस तरह से अक्षम हो जाएगा।

असल में, आपको क्वेरी श्रृंखला के बहुत अंत में मानचित्रण को स्थानांतरित करने की आवश्यकता है यदि आप अपने सभी प्रश्न EF डेटाबेस में चलाना चाहते हैं।

आप क्या कर सकते वास्तव में वास्तविक इकाई लौट रहा है वस्तुओं

public IQueryable<ItemDto> Get() 
    { 
     using (EfContext context = new EfContext()) 
     { 
      return context.items 
         .OrderByDescending(x => x.PubDate) 
         .Take(20)); 
     } 
    } 

और MVC बताने के लिए एक MediaTypeFormatter में इस क्रमानुसार करने। यहां आप ऑटोमैपर का उपयोग कर सकते हैं। ।

3

http://dotnetplusplus.wordpress.com/2013/08/30/odata-web-apis-with-automapper-3/

उपयोग वापसी _itemRepository .GetItemsQuery() .Project() के लिए();

+0

यह वास्तव में वास्तव में सेक्सी है। इस अद्यतन के लिए धन्यवाद! –

+0

प्रोजेक्ट()।()।() ने एक स्टैक ओवरफ्लो एक्सेप्शन फेंकता है जब नेविगेशन गुण दोनों सिरों से नेविगेट किए जाते हैं। उस पर काबू पाने का कोई तरीका? –

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