2015-02-08 2 views
1

Я хотел бы восстановить мой последний проект. в прошлом, я не использовал веб-API. Могу я просто использовать ODataQueryOptions для выполнения $ filter, $ orderby, $ top, $ skip для моего запроса в моем собственном handler.ashx? какой-нибудь предмет похоже.Как можно вручную создать ODataQueryOptions на .ashx

var option = new ODataQueryOptions(request.params); 
var query = option.ApplyTo(db.products); 
+0

Да, вы можете увидеть [здесь] (https://msdn.microsoft.com/en-us/library/system.web.http.odata.query.odataqueryoptions(v=vs.118).aspx) – qujck

ответ

0

Я думаю, что вы можете, если вы можете конструктор экземпляра ODataQueryOptions.

Но, Что это:

var option = new ODataQueryOptions(request.params); 

Web API не предоставляет такой конструктор. Это ваша собственная реализация?

Спасибо.

1

Один из способов добиться этого - вручную создать URI запроса и установить его в параметре запроса конструктора ODataQueryOptions. Так что это может быть не совсем то, что искали оригинальные плакаты (вопрос нуждается в некотором уточнении).

В моем случае у меня есть единичный тест, и я хотел бы подтвердить, что параметры odata применяются к моему запрашиваемому объекту. В следующем примере кода предположите, что вы тестируете ProductController, в котором есть поле ProductName.

// Manually set an OData query parameter 
const string restUrl = "http://localhost/api/product?$orderby=ProductName"; 

// Need to construct an HTTP Context and a Request, then inject them into the controller 
var config = new HttpConfiguration(); 
var request = new HttpRequestMessage(HttpMethod.Post, restUrl); 
var route = config.Routes.MapHttpRoute(WebApiConfig.DefaultRouteName, "api/{controller}/{id}"); 
var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "Product" } }); 

var controller = new ProductController() 
{ 
    Request = request, 
    ControllerContext = new HttpControllerContext(config, routeData, request), 
    Url = new UrlHelper(request) 
}; 

// Build up the OData query parameters 
var modelBuilder = new ODataConventionModelBuilder(); 
modelBuilder.AddEntity(typeof(Product)); 
var edmModel = modelBuilder.GetEdmModel(); 
var oDataQueryContext = new ODataQueryContext(edmModel, typeof(Product)); 
var oDataQueryOptions = new ODataQueryOptions<Product>(oDataQueryContext, _controller.Request); 

// Finally, call the controller 
var result = controller.Get(oDataQueryOptions); 
0

На основании ответа sfuqua в выше, я сделал свой собственный класс помощника, который строит OdataQueryOptions класс на основе OData Uri:

using System.Linq; 
using System.Net.Http; 
using System.Web.Http.OData; 
using System.Web.Http.OData.Builder; 
using System.Web.Http.OData.Query; 

namespace OdataHelpers 
{ 
    public static class ODataBuilder<T> 
    { 
     public static ODataQueryOptions<T> BuildOptions(string oDataUri) 
     { 
      var baseUri = ""; 
      var odUri = ""; 
      var spl = oDataUri.Split('?'); 
      if (spl.Count() == 0) 
       odUri = spl[0]; 
      else 
      { 
       baseUri = spl[0]; 
       odUri = spl[1]; 
      } 
      if (string.IsNullOrEmpty(baseUri)) 
       baseUri = "http://localhost/api/" + typeof(T).Name; 
      var request = new HttpRequestMessage(HttpMethod.Get, baseUri + "?" + oDataUri.Replace("?", "")); 
      var modelBuilder = new ODataConventionModelBuilder(); 
      modelBuilder.AddEntity(typeof(T)); 
      var edmModel = modelBuilder.GetEdmModel(); 
      var oDataQueryContext = new ODataQueryContext(edmModel, typeof(T)); 
      return new ODataQueryOptions<T>(oDataQueryContext, request); 
     } 
    } 
} 

Пример использования:

var OdataStuff = ODataBuilder<CustomerIntView>.BuildOptions("$orderby=Id"); 
+0

Я добавил эту реализацию в свою ReverseOdataUriParser lib: https: // GitHub. ком/Svakinn/ReverseOdataUriMapper – Svakinn

Смежные вопросы