Asp.net web api EntitySetController中的其他GetXYZ方法

Asp.net web api EntitySetController中的其他GetXYZ方法,asp.net-web-api,odata,Asp.net Web Api,Odata,我希望能够在EntitySetController派生的控制器类中具有其他GetXYZ方法。例如: [HttpGet] [Queryable] public string GetAirportsWithinRadius(int airportId, int radius) { var resultAirports = GetAirportsWithinRadius2(airportId, radius); re

我希望能够在EntitySetController派生的控制器类中具有其他GetXYZ方法。例如:

[HttpGet]
 [Queryable]
        public string GetAirportsWithinRadius(int airportId, int radius)
        {

            var resultAirports = GetAirportsWithinRadius2(airportId, radius);

            return resultAirports;            
        }
这是我的配置:

ActionConfiguration getAirportsWithinRadius =  modelBuilder.Entity<Airport>().Collection.Action("GetAirportsWithinRadius");
        getAirportsWithinRadius.Parameter<int>("airportId");
        getAirportsWithinRadius.Parameter<int>("radius");
        getAirportsWithinRadius.ReturnsCollectionFromEntitySet<Airport>("Airports");
ActionConfiguration getAirportsWithinRadius=modelBuilder.Entity().Collection.Action(“getAirportsWithinRadius”);
getAirportsWithinRadius.Parameter(“airportId”);
getAirportsWithinRadius.参数(“半径”);
getAirportsWithinRadius.ReturnsCollectionFromEntitySet(“机场”);
我希望此操作与默认的Get Queryable操作一样是可组合的,但这将是一个支持所有odata参数但另外支持airportId和radius的替代方法。这将首先通过radius搜索过滤机场(我知道怎么做-这与问题无关),然后返回可查询项,以便可以通过odata参数进一步过滤

我读到的所有内容都说这将是一个odata操作,因此必须是一个POST,但是Get也是一个操作,这是一个Get,所以为什么不允许使用附加参数的扩展getter呢?我错过什么了吗?我如何完成我想完成的事情

我将从ajax客户端这样调用它: GET/odata/Airports?$inlinecount=allpages&$top=25&airportId=2112&radius=50

与常规odata GET不同: 获取/odata/Airports?$inlinecount=allpages&$top=25

谢谢

编辑: 我现在了解到这是odata的一个“功能”,并且正在考虑将其作为未来的功能。让我们暂时忘记这一点的意义。它本质上是一个WebApi HttpGet,返回一个可查询的,对吗?因此,只要我不关心这个“函数”的元数据广告,我如何确保它是一个从ODataController内部的路由透视图可以访问的HttpGet?ODataController需要MapODataRoute,我是否可以使用其他MapHttpRoute添加非odata路由? 我这样问是因为在我看来我应该能够,但我所有的尝试都失败了(试图通过fiddler点击HttpGet)。我找不到使用其他非odata GET扩展ODataController的示例。有人能帮助我理解这个例子是否可以以及如何做到这一点吗

[Queryable]
        public IQueryable<Airport> Get()
        {
            return db.Airports;
        }
    [HttpGet]
     [Queryable]
            public string GetAirportsWithinRadius(int airportId, int radius)
            {

                var resultAirports = GetAirportsWithinRadius2(airportId, radius);

                return resultAirports;            
            }
[可查询]
公共IQueryable Get()
{
返回db机场;
}
[HttpGet]
[可查询]
公共字符串GetAirportsWithinRadius(int-airportId,int-radius)
{
var resultAirports=GetAirportsWithinRadius2(airportId,半径);
返回结果报告;
}

您正在寻找OData函数,它还不支持开箱即用。我们这里有个问题。你可以投票表决


Arrgg:)我加了我的一票。这一点非常重要,因为从语义上讲,vanilla Get有许多业务逻辑扩展。我现在有没有办法解决这个问题,完成我想要的?我想我可以编写一个传统的apicontroller…您应该从ODataController派生,这样OData相关的格式化程序就可以出现了。但是,即使我们有这种解决方法,问题是您是否希望在元数据文档上公开此操作/函数。由于Web API只支持操作,如果您将其指定为操作,那么元数据文档会将其显示为操作,而读取该文档的客户端会对此感到困惑,并会发布一篇文章。我猜您可以完全避免在元数据文档中显示这一点。好吧-接下来我想做的是:我想使用方便的EntitySetController或ODataController,并添加一个名为GetAirportsWithinRadius(int-airportId,int-radius)的附加HttpGet。我想将该方法用作一个普通的webapi控制器操作方法,我不需要任何元数据(即正式的odata函数发现,因为它还不存在)。但我需要手动定义一个路由,允许从fiddler调用它。除了MapOdatRoute配置之外,还有什么方法可以为该操作添加其他MapHttRoute配置吗?无论我做什么,我都会得到:“检测到无效的操作。'GetAirportsWithinRadius'不是可以绑定到“Collection([JumpSeatWeb.Airport Nullable=False])”的操作。”。我似乎无法在ODataController派生类中定义简单的附加HttpGet路由。除了元数据问题,还有什么原因可以解释为什么默认的ODataRoute配置会接管,并且不允许任何其他路由发生?