Asp.net web api 如何为总是返回单个实体的方法配置ODataWebAPI路由

Asp.net web api 如何为总是返回单个实体的方法配置ODataWebAPI路由,asp.net-web-api,odata,asp.net-web-api-routing,asp.net-web-api2,asp.net-web-api-odata,Asp.net Web Api,Odata,Asp.net Web Api Routing,Asp.net Web Api2,Asp.net Web Api Odata,我想配置一个始终返回单个实体的路由 控制器看起来像: StatsController类:ODataController{ 公共统计数据获取{ 返回新的统计数据; } } 访问它的url应该是:GET~/service prefix/stats 我看到的所有选项都涉及必须返回IQueryable,或者在返回单个实体时,以~/service prefix/EntitySet1的形式传入一个键 有没有一种方法可以在不返回iQuery的情况下实现上述功能?默认情况下,您的场景应该可以访问以下形式的任何操

我想配置一个始终返回单个实体的路由

控制器看起来像:

StatsController类:ODataController{ 公共统计数据获取{ 返回新的统计数据; } } 访问它的url应该是:GET~/service prefix/stats

我看到的所有选项都涉及必须返回IQueryable,或者在返回单个实体时,以~/service prefix/EntitySet1的形式传入一个键


有没有一种方法可以在不返回iQuery的情况下实现上述功能?

默认情况下,您的场景应该可以访问以下形式的任何操作:

例如:

公共统计获取[FromODataUri]int键{}


public Stat Getyour entity name[FromODataUri]int key{}

要访问单个对象而不需要entityset,odata v4引入了单例的概念

:

singleton允许直接从实体容器寻址单个实体,而无需知道其密钥,也无需实体集

更多信息:


我相信Singleton可以满足您的需求,但它并没有在WebApi中实现。幸运的是,还有另一种选择:unbound函数。只需遵循以下示例:

ProductsController中有一个方法:

    [HttpGet]
    [ODataRoute("GetSalesTaxRate(state={state})")]
    public IHttpActionResult GetSalesTaxRate([FromODataUri] string state)
    {
        return Ok(GetRate(state));
    }
它是通过以下URL请求的:~/service prefix/GetSalesTaxCreateState='WA',非常接近您的场景。您只需删除函数的参数:

    [HttpGet]
    [ODataRoute("GetStats()")]
    public IHttpActionResult GetStats()
    {
        return Ok(new Stats());
    }

现在您可以请求~/sevice prefix/GetStats。

根据OData协议,服务前缀之后的路径段主要是一个实体集,这意味着将返回一组实体。我想知道为什么你只需要一个实体而不是一个集合,通过请求这样一个URL?@tanjinfu从概念上讲,端点总是返回一个对象。该对象表示应用程序的当前状态,但它从来不是集合。感谢您的回复。我已经发布了我的答案。嗯……这个单例与你的问题有什么关系?@KiranChalla,ODataAPI上下文中的单例概念正是我所需要的:服务提供的单个实体,它从不在集合中,并且可以在不必提供索引的情况下解决