2013-06-03 33 views
3

我玩弄的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(); 
} 

样板网页API控制器的操作是:

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

如果我想通过目录或类别使用Web API来过滤我的查询,我会怎么做究竟是REST方式?鉴于路由的方式得到解决,以下将是一个暧昧电话:

IEnumerable<Movie> GetByCategory(int categoryId); 

我还没有看到这么多指导,有人可以提供一些适合我?

问候,

克里斯

回答

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

+0

我希望人们会忘记OData存在。 – Phill

+0

认为它是一个协议。我们不使用IQueryable,而是使用标准。用Google的** angularjs **。伟大的经验。你感觉到了吗? ;)OData和Google的JavaScript库。和NHibernate;) –