2012-05-02 14 views
5

में IQueryable के अलावा ओडाटा क्वेरी और प्रकार अन्य मैं एक एएसपी.NET वेब एपीआई एप्लिकेशन बना रहा हूं जो एटम या आरएसएस फ़ीड देता है। ऐसा करने के लिए, यह System.ServiceModel.Syndication.SyndicationFeed बनाता है और एक कस्टम MediaTypeFormatter HTTP स्वीकृति शीर्षलेख को संभालने के लिए ज़िम्मेदार है, SyndicationFeed को Atom10FeedFormatter या Rss20FeedFormatter में कनवर्ट करना और प्रतिक्रिया स्ट्रीम में परिणाम स्ट्रीम करना। अब तक सब ठीक है.ASP.NET वेब एपीआई

मेरे नियंत्रक इस तरह दिखता है:

 
    public class FeedController : ApiController 
    { 
     public HttpResponseMessage Get() 
     { 
      FeedRepository feedRepository = new FeedRepository(); 
      HttpResponseMessage<SyndicationFeed> successResponseMessage = new HttpResponseMessage<SyndicationFeed>(feedRepository.GetSyndicationFeed()); 
      return successResponseMessage; 
     } 
    } 

मुझे क्या करना चाहते हैं का उपयोग करना है निर्मित OData मेरे फ़ीड फिल्टर करने के लिए क्वेरी करने के लिए, लेकिन IQueryable<SyndicationFeed> को Get() विधि की वापसी प्रकार बदलने स्पष्ट रूप से काम नहीं करेगा क्योंकि SyndicationFeedIQueryable लागू नहीं करता है।

SyndicationFeed पर IEnumerable<SyndicationItem> संपत्ति पर निर्मित ओडाटा क्वेरीिंग का उपयोग करने का कोई तरीका है?

उत्तर

3

सिस्टम। लिंक्स नेमस्पेस AsQueryable नामक एक विस्तार विधि IEnumerable इंटरफ़ेस प्रदान करता है। आपका कोड इस की तर्ज पर दिखेगा:

public class FeedController : ApiController 
{ 
    public IQueryable<SyndicationFeed> Get() 
    { 
     FeedRepository feedRepository = new FeedRepository(); 

     //TODO: Make sure your property handles empty/null results: 
     return feedRepository.GetSyndicationFeed() 
        .YourEnumerableProperty.AsQueryable(); 
    } 
} 
+0

सुझाव के लिए धन्यवाद, लेकिन यह काम नहीं करेगा क्योंकि वापसी प्रकार गलत है: चेक "लागू क्वेरी विकल्प सीधे" https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options

अपने मामले कहीं भी होगी के लिए कम से अनुभाग की तरह दिखता है। आपके उदाहरण में, यह एक IQueryable <सिंडिकेशन फीड> की अपेक्षा कर रहा है लेकिन आप एक आईनेमरेबल <सिंडिकेशन इटिम> लौट रहे होंगे। सिंडिकेशनफिड IQueryable को लागू नहीं करता है लेकिन मैं इसे छोड़ नहीं सकता क्योंकि यह मेरे आरएसएस या एटम फ़ीड के लिए लिफाफा है। सवाल यह है कि, मैं अभी भी अपने रिटर्न प्रकार के रूप में सिंडिकेशनफिड को रखते हुए INumerable को फ़िल्टर करने के लिए ओडाटा क्वेरी कैसे प्राप्त करूं? –

+0

'रिटर्न सिंडिकेशन इटम्स। एक्साक्टेबल(); ' –

3

यह सवाल प्रासंगिक नहीं रह गया है, के बाद से माइक्रोसॉफ्ट कि वेब एपीआई के बीटा बिल्ड में था OData क्वेरी किए जाने के लिए मौलिक समर्थन को हटा दें।

भविष्य के संस्करण में अधिक संपूर्ण ओडाटा समर्थन शामिल होगा। कोडप्लेक्स और नुगेट के माध्यम से इसका एक प्रारंभिक निर्माण उपलब्ध है और यहां अधिक विवरण हैं: http://blogs.msdn.com/b/alexj/archive/2012/08/15/odata-support-in-asp-net-web-api.aspx

+0

क्या आपको अपने प्रश्न के लिए कोई समाधान मिला ?? मुझे एक ही समस्या का सामना करना पड़ रहा है .... कृपया मेरा प्रश्न जांचें और मुझे बताएं कि क्या आप किसी भी तरह से मदद कर सकते हैं http://stackoverflow.com/questions/13451649/how-to-apply-paging- विशिष्ट रूप से-to-a -जो -List-है-भाग-की-एक-json-का उपयोग कर-एएसपी शुद्ध – Bitsian

0

ओडाटा के साथ काम करते समय आपको नियंत्रक से IQuerable वापस करने की आवश्यकता नहीं है।

public SyndicationFeed Get(ODataQueryOptions<SyndicationItem> opts) 
{ 
    var settings = new ODataValidationSettings(); 

    opts.Validate(settings); 

    SyndicationFeed result = feedRepository.GetSyndicationFeed(); 

    result.Items = opts.ApplyTo(result.Items.AsQuerable()).ToArray(); 

    return result; 
} 
संबंधित मुद्दे