3

我正在使用 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);

我没有看到太多关于这方面的指导,有人可以为我提供一些吗?

问候,

克里斯

4

1 回答 1

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标准

于 2013-06-03T16:38:44.600 回答