2013-01-18 27 views
6

Tôi đang sử dụng ASP.Net WebAPI daily build (2013-01-16) để có được hỗ trợ OData mới nhất có thể.ASP.NET WebAPI OData - Thừa kế từ EntitySetController <> nhưng sử dụng Get (tùy chọn ODataQueryOptions) thay vì [Queryable] Get()

Khi Meta-Me blog on MSDN OData 0.2.0-alpha release post cho biết, hiện tại có EntitySetController<T> mà từ đó bộ điều khiển OData có thể được bắt nguồn để lấy đi rất nhiều mã đau và đường ống dẫn nước.

Các EntitySetController<T> cụ lớp Get() như

[Queryable] 
public virtual IQueryable<TEntity> Get() 
{ 
    throw EntitySetControllerHelpers.GetNotImplementedResponse(Request); 
} 

Tôi muốn tận dụng các Get(ODataQueryOptions options) phương pháp cụ thể hơn được cung cấp bởi sự hỗ trợ ASP.Net Web API OData.

Tôi đã mã hóa nó như

public IEnumerable<Patient> Get(ODataQueryOptions options) 
{ 
    IQueryable patients = entities.Patients; 

    if (options.Filter != null) 
    { 
     patients = options.Filter.ApplyTo(patients, new ODataQuerySettings()); 
    } 

    return (patients as IQueryable<Patient>).AsEnumerable(); 
} 

(Tôi cũng đã có sự trở lại này IQueryable <> và nhìn thấy một người nào đó nói chuyện khác về một ODataResult - đó là một loại I không thể khám phá tại thời điểm này).

Tuy nhiên, nếu tôi cố gắng sử dụng phương pháp Nhận ODataQueryOptions-có trụ sở tại điều khiển của riêng tôi tôi nhận được một thông báo lỗi về nhiều hành động phù hợp với yêu cầu. Cụ thể lỗi đó là

Multiple actions were found that match the request: 

System.Collections.Generic.IEnumerable`1[Dox.Server.Model.Patient] Get(System.Web.Http.OData.Query.ODataQueryOptions) on type Dox.Server.Web.Controllers.PatientController 

System.Linq.IQueryable`1[Dox.Server.Model.Patient] Get() on type System.Web.Http.OData.EntitySetController`2[[Dox.Server.Model.Patient, Dox.Server.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 

Tôi giả định này là do sự phân giải đường (xin lỗi nếu đó là ASP.NET nghèo ngữ routing) thấy Get() hoặc Nhận (...) trên lớp cơ sở của bộ điều khiển cũng như chính lớp điều khiển.

Câu hỏi: a) Có một số cách để điều chỉnh các tuyến đường để sửa lỗi này? b) Nếu không, tôi nên làm cho phiên bản riêng của tôi về EntitySetController<T> và trao đổi trên đó là Get() phương pháp?

Cấu hình được gọi bằng Application_Start() được giới hạn trong

public static void EnableOData(HttpConfiguration config) 
{ 
    var model = BuildModelImplicitly(config); 

    //As per LinqPad forum: http://forum.linqpad.net/discussion/178/odata-v3-not-working 
    IEdmEntityContainer container = model.EntityContainers().First(); 
    model.SetIsDefaultEntityContainer(container, true); 

    //config.EnableOData(model, "api"); 
    config.Routes.MapODataRoute("OData", "api", model); 

    //config.EnableSystemDiagnosticsTracing(); 

} 

Không có cấu hình khác được gọi để làm với các tuyến đường hoặc xử lý, vv Lưu ý rằng các EnableOData() phương pháp trên HttpConfiguration không còn tồn tại bản dựng hàng đêm mới nhất theo một cuộc thảo luận CodePlex this.

Cảm ơn rất nhiều!

Trả lời

13

Nó rất mát mẻ để thấy rằng bạn đang sử dụng hàng đêm của chúng tôi được xây dựng :)

Lý do bạn đang nhận được một hành động phù hợp với lỗi nhiều là vì EntitySetController đã định nghĩa một phương thức GET. Tin tốt là EntitySetController cũng định nghĩa một thuộc tính QueryOptions mà bạn có thể sử dụng để truy xuất các tùy chọn truy vấn. Vì vậy, bạn sẽ có thể ghi đè lên phương thức Get của EntitySetController và sử dụng thuộc tính tùy chọn truy vấn thay vì tham số. Nó sẽ hoạt động chính xác giống như khi bạn đã ràng buộc các tùy chọn truy vấn vào một tham số hành động.

+0

vĩ đại - cảm ơn bạn rất rất nhiều :) Tôi hoàn toàn bị bỏ qua thuộc tính QueryOptions. Tôi sẽ có một vở kịch và quay trở lại nếu tôi có bất kỳ vấn đề gì (đó là chiều Thứ Sáu ở đây để điều này có thể kết thúc là một phiên hack cuối tuần). –

+0

Nếu có ai thắc mắc, bạn có thể thấy các tùy chọn trong bộ điều khiển bằng cách sử dụng phương thức 'Get':' var opts = this.QueryOptions; ' – atconway

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