web api:检查odata查询

时间:2017-04-18 13:04:31

标签: asp.net-web-api odata

我有一个web api暴露会话列表。这是我的代码:

        [RoutePrefix("api/data")]
        public class SessionController : ApiController
        {
            [HttpGet]
            [Route("sessions")]
            [Queryable]
            public IQueryable<Session> Get()
            {
                List<Session> list = new List<Session>();
                list.Add(new Session { Id = 1, Name = "name 1", Place = "place 1", SessionOn = Convert.ToDateTime("1/1/2014") });
                list.Add(new Session { Id = 2, Name = "name 2", Place = "place 2", SessionOn = Convert.ToDateTime("2/1/2014") });
                list.Add(new Session { Id = 3, Name = "name 3", Place = "place 3", SessionOn = Convert.ToDateTime("3/1/2014") });
                return list.AsQueryable();
            }
        }

        public class Session
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public string Place { get; set; }
            public DateTime SessionOn { get; set; }
        }

用户可以请求此API查看所有会话:

mydomain/api/data/sessions

我添加了oData以允许用户查询和过滤这些数据:

mydomain/api/data/sessions?$filter=Name eq 'name1'
mydomain/api/data/sessions?$filter=Place eq 'place 1'

一切运行良好,剩下的唯一问题是我想检查用户给出的查询,告诉他一个值无效,例如:

在我的会话列表中,字段的可能值&#39;放置&#39;是:

地点1
地方2
地方3
地方4

如果用户执行以下请求:

mydomain/api/data/sessions?$filter=Place eq 'placezzzzz 1'

他将获得一组空的Session。我想做的是检查我的后端代码api给出的值(也就是说&#39; placezzzzz 1&#39;)并向用户返回一个响应,告知该值无效。

1 个答案:

答案 0 :(得分:0)

您可以更改方法签名以包含ODataQueryOptions<T>参数:

[EnableQuery]
public IQueryable<Session> Get(ODataQueryOptions<Session> options) {
    //Do something fun with the filter:
    var filter = options.Filter;
}

可以在不更改路由的情况下将options参数添加到Get方法中。它包含有关请求的各种信息,包括使用的过滤器。您仍然可以像过去一样返回您的IQueryable。

我使用[System.Web.OData.EnableQuery]属性而不是[Queryable],因为QueryableAttribute已过时。 (source msdn)我不确定此解决方案是否适用于旧版本。