【发布时间】:2013-08-09 05:13:49
【问题描述】:
我有一个包含 76 个用户的用户表和用户组表。
使用 MVC、OData、通用存储库和 EF,我尝试在基于用户组进行过滤时优化数据检索:
/api/Users?$filter=USERGROUPS/any(usergroup: usergroup/ID eq 'Group1')
在客户端,我得到了正确的用户数 - 71(因为 OData 正在根据结果进行过滤),但是我想限制从实际查询返回的记录数 - 即。我不想返回所有记录然后过滤(对于非常大的数据集不是最佳的)。
我的API控制器方法如下:
[Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
public IQueryable<USER> Get()
{
var unitOfWork = new ATMS.Repository.UnitOfWork(_dbContext);
var users = unitOfWork.Repository<USER>()
.Query()
.Include(u => u.USERGROUPS)
.Get()
.OrderBy(order => order.USERNAME);
unitOfWork.Save(); // includes Dispose()
return users.AsQueryable();
}
我在this post 中读到:
实体框架负责构建基于 请求。
但是,使用 SQL Server 分析器,执行的查询是请求所有记录,而不是过滤查询。
向查询添加 .Take() 并不能达到预期的结果,因为我们还需要返回的实际记录数用于分页。
我正在考虑使用通过 ODataQueryOptions 抓取一些属性,但这似乎也不太正确。
我对工作单元和存储库的实施是否不正确,与我要完成的工作有关,如果是,如何纠正?
【问题讨论】:
标签: asp.net-mvc asp.net-web-api entity-framework-5 odata