Asp.net web api ASP.NET WebAPI OData-从EntitySetController继承<&燃气轮机;但是使用Get(ODataQueryOptions选项)而不是[Queryable]Get()

Asp.net web api ASP.NET WebAPI OData-从EntitySetController继承<&燃气轮机;但是使用Get(ODataQueryOptions选项)而不是[Queryable]Get(),asp.net-web-api,odata,Asp.net Web Api,Odata,我正在使用ASP.NETWebAPI夜间构建(2013-01-16)获得最新的OData支持 正如上面所说的,现在有了一个EntitySetController,从中可以派生出OData控制器,从而消除了很多痛苦和管道代码 EntitySetController类将Get()实现为 (我还收到了这个IQueryable的回复,看到其他人谈论ODataResult——这是我目前无法发现的类型) 但是,如果我尝试在自己的控制器中使用基于ODataQueryOptions的Get方法,我会收到一条关于

我正在使用ASP.NETWebAPI夜间构建(2013-01-16)获得最新的OData支持

正如上面所说的,现在有了一个
EntitySetController
,从中可以派生出OData控制器,从而消除了很多痛苦和管道代码

EntitySetController
类将Get()实现为

(我还收到了这个IQueryable的回复,看到其他人谈论ODataResult——这是我目前无法发现的类型)

但是,如果我尝试在自己的控制器中使用基于ODataQueryOptions的Get方法,我会收到一条关于多个操作与请求匹配的错误消息。具体地说,这个错误是错误的

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]]
我假设这是由于路由解析程序(如果这是糟糕的ASP.NET路由术语,那么很抱歉)在控制器的基类以及控制器类本身上看到Get()或Get(…)

问题: a) 有没有办法调整路线来解决这个问题? b) 如果不是,我应该制作自己版本的
EntitySetController
并替换掉它的Get()方法吗

应用程序_Start()调用的配置仅限于

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();

}
没有调用其他配置来处理路由或处理程序等。请注意,根据CodePlex的讨论,HttpConfiguration上的EnableOData()方法在最新的夜间构建中不再存在


非常感谢

看到您正在使用我们的夜间版本,这很酷:)


出现多个匹配操作错误的原因是EntitySetController已经定义了Get方法。好消息是EntitySetController还定义了可用于检索查询选项的
QueryOptions
属性。因此,您应该能够重写EntitySetController的Get方法,并使用查询选项属性而不是参数。它的行为应该与将查询选项绑定到操作参数的方式完全相同。

太好了-非常感谢:)我完全忽略了QueryOptions属性。如果我有任何问题,我会玩一个游戏,然后回来(这里是周五下午,所以这可能是周末的黑客会议)。如果有人想知道,您可以通过在
Get
方法中使用以下命令查看控制器中的选项:
var opts=this.QueryOptions
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]]
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();

}