Web-Api OData控制器返回单个记录

时间:2014-01-21 11:53:08

标签: asp.net asp.net-web-api odata endpoint

我有像这样的OData-Controller(缩短代码):

    public class FooController : ODataController
    {
        [Queryable]
        public IEnumerable<Foo> Get()
        {       
            return ...;
        }

        [Queryable]
        public SingleResult<Foo> GetById([FromODataUri] int id)
        {
            return SingleResult.Create<Foo>(...);
        }

我在浏览器中调用/myprefix/foo并调用Get()方法。

现在我在浏览器中调用/myprefix/foo(1),始终调用Get()方法。 但我想调用GetById()方法。

如何运行GetById()? 感谢

4 个答案:

答案 0 :(得分:6)

我确认评论中提供的解决方案是正常工作

使用作为参数名称更改方法参数:

public Unit GetBook([FromODataUri] int key)
{
    return db.Books.Single(b => b.BookID == key);
}

并且它会接受这种请求,传递记录主键:

server/odata/Books(34)

答案 1 :(得分:2)

Web API中的默认OData路由约定会查找以下操作:

GetFoo([FromODataUri] int id)(即...&#34;获取&#34; +实体类型名称)

OR

Get([FromODataUri] int id)

所以请务必将您的操作更改为上述任一项。

如果您不喜欢上述约定,可以编写自定义IODataRoutingConvention

答案 2 :(得分:1)

如果你想调用GetById()方法。

只是你打电话给 / api / foo / GetById?id =

答案 3 :(得分:0)

如果路径名称与实体集不同,您可以执行的操作是添加ODataRoute属性:

对于查询IEnumerable,您将使用属性:

[ODataRoute("Foo")]
public IEnumerable<Foo> Get()

要查询单个结果,您可以使用以下语法:

[ODataRoute("Foo({key})")]
public SingleResult<Foo> GetById([FromODataUri] int key)

除此之外,我想现在使用EnableQuery而不是Queryable也是可取的。