2012-05-02 12 views
5

Tôi đang xây dựng một ứng dụng ASP.NET Web API trả về một nguồn cấp dữ liệu Atom hoặc RSS. Để làm điều này, nó xây dựng một System.ServiceModel.Syndication.SyndicationFeed và tùy chỉnh MediaTypeFormatter chịu trách nhiệm xử lý Tiêu đề chấp nhận HTTP, chuyển đổi SyndicationFeed thành số Atom10FeedFormatter hoặc Rss20FeedFormatter và truyền trực tuyến kết quả đến luồng phản hồi. Càng xa càng tốt.Truy vấn OData và các loại khác với IQueryable trong ASP.NET Web API

điều khiển của tôi trông giống như sau:

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

Những gì tôi muốn làm là tận dụng được xây dựng trong OData truy vấn để lọc thức ăn của tôi, nhưng thay đổi kiểu trả về của phương pháp Get()-IQueryable<SyndicationFeed> rõ ràng sẽ không hoạt động kể từ khi SyndicationFeed không triển khai IQueryable.

Có cách nào để sử dụng truy vấn OData tích hợp trên thuộc tính IEnumerable<SyndicationItem> trên SyndicationFeed không?

Trả lời

3

Không gian tên System.Linq cung cấp phương thức tiện ích có tên AsQueryable đến giao diện IEnumerable. Mã của bạn sẽ xem xét các dòng này:

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

Cảm ơn đã gợi ý nhưng điều đó sẽ không làm việc vì kiểu trả về là sai. Trong ví dụ của bạn, nó đang mong đợi một IQueryable nhưng bạn sẽ trả về một IEnumerable. SyndicationFeed không triển khai IQueryable nhưng tôi không thể loại bỏ nó vì nó là phong bì cho nguồn cấp dữ liệu RSS hoặc Atom của tôi. Câu hỏi là, làm thế nào để tôi nhận được truy vấn OData để lọc IEnumerable trong khi vẫn giữ SyndicationFeed làm kiểu trả về của tôi? –

+0

'return syndicationItems.AsQueryable();' –

3

Câu hỏi này không còn liên quan vì Microsoft loại bỏ hỗ trợ thô sơ cho truy vấn OData trong bản dựng Beta của API Web.

Phiên bản trong tương lai sẽ bao gồm hỗ trợ OData hoàn chỉnh hơn. Có một bản xây dựng ban đầu này có sẵn thông qua CodePlex và NuGet và có thêm chi tiết tại đây: http://blogs.msdn.com/b/alexj/archive/2012/08/15/odata-support-in-asp-net-web-api.aspx

+0

Bạn có tìm thấy giải pháp nào cho câu hỏi ur không ?? Tôi đang phải đối mặt với một vấn đề tương tự .... plz kiểm tra câu hỏi của tôi và cho tôi biết nếu u có thể giúp đỡ trong bất kỳ cách nào http://stackoverflow.com/questions/13451649/how-to-apply-paging-specifically-to-a -list-which-là-part-of-a-json-sử dụng-asp-net – Bitsian

0

Bạn không phải trả lại IQuerable từ bộ điều khiển khi làm việc với OData. Kiểm tra "Gọi Query Tùy chọn trực tiếp" ở https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options

Đối với trường hợp của bạn, nó sẽ trông giống như:

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; 
}