2013-03-15 44 views
25

Tôi đang sử dụng ra khỏi ValuesController hộp trong một ứng dụng API ASP.NET WebWeb API OData Inlinecount không làm việc

public class ValuesController : ApiController 
{ 
    // GET api/values 
    [Queryable(PageSize = 1)] 
    public IQueryable<string> Get() 
    { 
     return new string[] { "value1", "value2", "value3", "value4", "value5" }.AsQueryable(); 
    } 
} 

Khi tôi get http://localhost/api/values?$inlinecount=allpages

Đây là phản ứng

<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<string>value1</string> 
</ArrayOfString> 

Tôi có uncommented config.EnableQuerySupport();

Lọc, sắp xếp ng làm việc tốt.

Nếu tôi cố gắng get http://localhost/api/values?$inlinecount=XXXXX tôi nhận được một ngoại lệ, vì vậy có vẻ như các ứng dụng Web API biết về inlinecount

<Message>The query specified in the URI is not valid.</Message> 
<ExceptionMessage>'xxx' is not a valid value for $inlinecount.</ExceptionMessage> 
<ExceptionType>Microsoft.Data.OData.ODataException</ExceptionType> 

Tôi chắc chắn có gói Microsoft.AspNet.WebApi.OData - đây là sản phẩm của các gói Bảng điều khiển quản lý

PM> Install-Package Microsoft.AspNet.WebApi.OData 
Attempting to resolve dependency 'Microsoft.Net.Http (= 2.0.20710.0 && < 2.1)'. 
Attempting to resolve dependency 'Microsoft.AspNet.WebApi.Client (= 4.0.20710.0 && < 4.1)'. 
Attempting to resolve dependency 'Newtonsoft.Json (= 4.5.6)'. 
Attempting to resolve dependency 'Microsoft.AspNet.WebApi.Core (= 4.0.20710.0 && < 4.1)'. 
Attempting to resolve dependency 'Microsoft.Data.OData (= 5.2.0 && < 5.3.0)'. 
Attempting to resolve dependency 'System.Spatial (= 5.2.0)'. 
Attempting to resolve dependency 'Microsoft.Data.Edm (= 5.2.0)'. 
'Microsoft.AspNet.WebApi.OData 4.0.0' already installed. 
WebServicesProject already has a reference to 'Microsoft.AspNet.WebApi.OData 4.0.0'. 

Mọi đề xuất?

Trả lời

26

Câu hỏi hay.

$ inlinecount ra khỏi hộp chỉ hoạt động khi bạn gửi trả lời OData. Lý do cho điều này là OData định nghĩa các trường đặc biệt trong dữ liệu mà XML và JSON không xác định. Vì vậy, trong OData, một phản hồi có thể trông giống như sau:

{ 
    "odata.metadata":"http://localhost:12345/odata/$metadata#Customers", 
    "odata.count":"4", 
    "value":[ ... ] 
} 

Chú ý trình bao bọc với thuộc tính "odata.count". Điều này khác với cách các trình định dạng XML và JSON mặc định ghi dữ liệu vì chúng không có trình bao bọc cho thông tin bổ sung này. Vì vậy, các trình định dạng khác theo mặc định không thay đổi.

Bây giờ bạn có một số tùy chọn:

Bạn có thể chọn sử dụng định dạng OData. Đối với điều này, bạn sẽ muốn làm theo hướng dẫn trong bài viết trên blog này:

http://blogs.msdn.com/b/webdev/archive/2013/01/29/getting-started-with-asp-net-webapi-odata-in-3-simple-steps.aspx

Bạn cũng có thể chọn để thay trả về một PageResult<T>. Điều này có vẻ như thế này:

public PageResult<Customer> Get(ODataQueryOptions<Customer> queryOptions) 
{ 
    IQueryable results = queryOptions.ApplyTo(_customers.AsQueryable()); 
    return new PageResult<Customer>(results as IEnumerable<Customer>, Request.GetNextPageLink(), Request.GetInlineCount()); 
} 

này nên làm việc tốt cho OData, JSON và XML bằng cách thêm một đối tượng wrapper cho XML và JSON có thể bao gồm Count và liên kết trang tiếp theo.

+1

Từ đọc tài liệu MS trên http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options này, có vẻ như nó nên làm việc ra khỏi hộp, như lọc và phân loại? – tom

+3

Tài liệu sai trong trường hợp này. Sự khác biệt là việc lọc không cần phải thay đổi "hình dạng" của dữ liệu, nhưng thêm số nội tuyến và liên kết trang tiếp theo sẽ làm. Vì vậy, lọc hoạt động ra khỏi hộp cho các trình định dạng khác, nhưng $ inlinecount thì không. –

+0

Hãy xem breezejs.com. Phiên bản mới nhất hoạt động với tất cả cú pháp MS OData và tất cả các hỗ trợ inlinecount, chọn và mở rộng. –

Các vấn đề liên quan