Asp.net web api 如何在.ashx上手动创建ODataQueryOptions

Asp.net web api 如何在.ashx上手动创建ODataQueryOptions,asp.net-web-api,odata,Asp.net Web Api,Odata,我想重建我的最后一个项目。 在过去,我没有使用任何Web API。 我可以使用ODataQueryOptions执行$filter、$orderby、$top、$skip吗 在我自己的handler.ashx中查询? 像这样的东西 var option = new ODataQueryOptions(request.params); var query = option.ApplyTo(db.products); 如果你能构造一个ODataQueryOptions的实例,我认为你能 但是,这是

我想重建我的最后一个项目。 在过去,我没有使用任何Web API。 我可以使用ODataQueryOptions执行$filter、$orderby、$top、$skip吗 在我自己的handler.ashx中查询? 像这样的东西

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

如果你能构造一个
ODataQueryOptions
的实例,我认为你能

但是,这是什么:

var option = new ODataQueryOptions(request.params);
WebAPI不提供这样的构造函数。这是您自己的实现吗


谢谢。

实现这一点的一种方法是手动构造请求URI,并在
ODataQueryOptions
构造函数的请求参数中设置该URI。所以,这可能并不正是原始海报想要的(这个问题需要一些澄清)

在我的例子中,我有一个单元测试,我想验证odata选项是否应用于我的可查询对象。在下面的示例代码中,假设您正在测试一个
ProductController
,其中包含一个ProductName字段

//手动设置OData查询参数
常量字符串restUrl=”http://localhost/api/product?$orderby=ProductName“;
//需要构造一个HTTP上下文和一个请求,然后将它们注入控制器
var config=新的HttpConfiguration();
var request=newhttprequestmessage(HttpMethod.Post,restUrl);
var route=config.Routes.maphttroute(WebApiConfig.DefaultRouteName,“api/{controller}/{id}”);
var routeData=新的HttpRouteData(路由,新的HttpRouteValueDictionary{{{“控制器”,“产品”});
var controller=新产品控制器()
{
请求=请求,
ControllerContext=新的HttpControllerContext(配置、路由数据、请求),
Url=新的UrlHelper(请求)
};
//建立OData查询参数
var modelBuilder=新ODataConventionModelBuilder();
modelBuilder.附录(产品类型);
var edmModel=modelBuilder.GetEdmModel();
var oDataQueryContext=新的oDataQueryContext(edmModel,typeof(Product));
var oDataQueryOptions=新的oDataQueryOptions(oDataQueryContext,_controller.Request);
//最后,调用控制器
var result=controller.Get(oDataQueryOptions);

基于sfuqua上面的回答,我创建了自己的helper类,它基于ODataURI构建OdataQueryOptions类:

使用System.Linq;
使用System.Net.Http;
使用System.Web.Http.OData;
使用System.Web.Http.OData.Builder;
使用System.Web.Http.OData.Query;
名称空间OdataHelpers
{
公共静态类ODataBuilder
{
公共静态ODataQueryOptions构建选项(字符串oDataUri)
{
var baseUri=“”;
var odUri=“”;
var spl=oDataUri.Split(“?”);
如果(spl.Count()==0)
odUri=spl[0];
其他的
{
baseUri=spl[0];
odUri=spl[1];
}
if(string.IsNullOrEmpty(baseUri))
baseUri=”http://localhost/api/“+T.名称的类型;
var request=newhttprequestmessage(HttpMethod.Get,baseUri+“?”+oDataUri.Replace(“?”,”);
var modelBuilder=新ODataConventionModelBuilder();
modelBuilder.附录(类型(T));
var edmModel=modelBuilder.GetEdmModel();
var oDataQueryContext=新的oDataQueryContext(edmModel,typeof(T));
返回新的ODataQueryOptions(oDataQueryContext,请求);
}
}
}
示例用法:

var OdataStuff=ODataBuilder.BuildOptions(“$orderby=Id”);

是的,您可以看到我已将此实现添加到我的ReverseDatauriParser库中:终于!!这1)有效,2)不需要使用数据库实体的大规模实现。谢谢我尝试将该方法移植到.NET5,但它不起作用。你有没有一个与.NET5类似的例子。这个应该是答案。对我来说,它非常适合对我的服务和端点进行单元测试。