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

4

我有一个像这样的OData控制器(简化代码):

    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()方法呢? 谢谢。


我找到了解决方案。我在 GetById 中将“int id”更改为“int key”。现在它可以工作了。 - user1702269
做得好,Boqus,它也帮了我。将其作为答案添加。 - Vland
4个回答

7

我确认评论中提供的解决方案是有效的

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

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

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

server/odata/Books(34)

2

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

GetFoo([FromODataUri] int id) (即"Get" + 实体类型名称)

或者

Get([FromODataUri] int id)

因此,请确保将您的操作更改为上述任一选项。

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


1
如果您想调用 GetById() 方法,只需通过 /api/foo/GetById?id= 进行调用。

0

如果路由名称与实体集不同,您可以添加ODataRoute属性:

要查询IEnumerable,您需要使用以下属性:

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

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

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

此外,我认为现在使用EnableQuery而不是Queryable更可取。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接