我有一个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;)并向用户返回一个响应,告知该值无效。
答案 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)我不确定此解决方案是否适用于旧版本。