Asp.net Web API和带有外键的查询
我在玩弄Web API,在创建查询以基于过滤器提取数据方面有点困难。经典的例子是基于外键回调项目列表 假设我有以下实体:Asp.net Web API和带有外键的查询,asp.net,asp.net-mvc,asp.net-web-api,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和实体框架来构建检索方法,这些方法可以被多个调用客户机使用,但其返回
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();
}
public IEnumerable Get(电影过滤器){
IQueryable查询=_context.tblMovie;
如果(!String.IsNullOrEmpty(filter.directorId))
其中(m=>m.directoryId==filter.directorId);
如果(!String.IsNullOrEmpty(filter.categoryId))
其中(m=>m.categoryId==filter.categoryId);
返回query.ToList();
}
样板Web API控制器操作包括:
IEnumerable<Movie> Get();
Movie Get(int id)
IEnumerable Get();
电影获取(int-id)
如果我想用Web API按目录或类别过滤查询,我应该如何以RESTful方式进行过滤?考虑到解决路由问题的方式,以下调用将是不明确的:
IEnumerable<Movie> GetByCategory(int categoryId);
IEnumerable GetByCategory(int categoryId);
我在这方面没有太多的指导,有人能给我提供一些吗
问候,
Chris其中一种方法是使用OData协议 还有一个支持OData筛选的库,支持通过
IQueryable
接口进行查询
它可以被看作是一个更复杂的一点,但你得到了很多。OData标准的部分内容:
- $filter-根据布尔条件筛选结果
- $select-应选择哪些列/属性
- $inlinecount-告诉服务器在响应中包含匹配实体的总数。(对于服务器端分页非常有用。)
- $orderby-对结果进行排序
- $skip-跳过前n个结果
- $top-仅返回结果的前n个
老实说,我们使用的是
OData
。。。而不使用IQueryable和MS库。我们刚刚创建了自己的解析器,只支持有限的东西。但是现在有了标准,我希望人们忘记OData的存在,把它当作一个协议。我们不使用IQueryable,而是使用标准。用谷歌的angularjs。很好的经验。你感觉到了吗OData和谷歌的javascript库。和NHibernate;)