Web API和带外键的查询

时间:2013-06-03 15:58:13

标签: asp.net asp.net-mvc asp.net-web-api

我正在使用Web API,我在创建查询以根据过滤器撤回数据方面苦苦挣扎。经典的例子是根据外键撤回一个项目列表。

我们说我有以下实体:

Movie
======
id
directorId
categoryId

使用以下方法构建DAO并不罕见:

MovieRepo.GetByDirector(int directoryId);
MovieRepo.GetByCategory(int category);

最近,我一直在使用Linq和实体框架来构建可供多个调用客户端使用的检索方法,但其返回的列表可以根据传递给过滤器的条件进行过滤

public IEnumerable<Movie> Get(MovieFilter filter){
    IQueryable<Movie> query = _context.tblMovie;

    if(!String.IsNullOrEmpty(filter.directorId))
         query.Where(m => m.directoryId == filter.directorId);

    if(!String.IsNullOrEmpty(filter.categoryId))
          query.Where(m => m.categoryId == filter.categoryId);

    return query.ToList();
}

样板Web API控制器操作是:

IEnumerable<Movie> Get();
Movie Get(int id)

如果我想使用Web API按目录或类别过滤我的查询,我究竟会以RESTful方式执行此操作?鉴于路由解析的方式,以下将是一个模糊的调用:

IEnumerable<Movie> GetByCategory(int categoryId);

我没有看到很多指导,有人可以为我提供一些吗?

此致

克里斯

1 个答案:

答案 0 :(得分:1)

其中一种方法是使用OData协议http://www.odata.org/docs/

还有一个支持OData过滤的库http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api,支持查询IQueryable接口

可以看出它有点复杂,但你获得了很多。 OData标准的一部分:

  • $ filter - 根据布尔条件过滤结果。
  • $ select - 应选择哪些列/属性
  • $ inlinecount - 告诉服务器在响应中包含匹配实体的总数。 (对于服务器端分页很有用。)
  • $ orderby - 对结果进行排序。
  • $ skip - 跳过前n个结果。
  • $ top - 仅返回结果的前n个。

老实说,我们正在使用OData ...而不使用IQueryable和MS库。我们刚刚创建了自己的解析器,只支持有限的东西。但是有OData标准