我可能会遗漏一些简单但基于这篇博文:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options这应该有用。我有以下控制器方法:
public virtual IQueryable<DtoAgent> Get(ODataQueryOptions<Agent> options, bool includeInactive = false, bool includeDeleted = false)
{
IQueryable<Agent> agents = null;
if (includeDeleted && includeInactive)
{
agents = agentRepository.FindAll();
}
else if (includeDeleted)
{
agents = agentRepository.FindBy(a => a.ussiStatus == "A");
}
else if (includeInactive)
{
agents = agentRepository.FindBy(a => !a.IsDeleted);
}
if (agents == null)
{
agents = agentRepository.FindByExp(a => a.ussiStatus == "A" && !a.IsDeleted);
}
options.ApplyTo(agents);
return agents.ToDtos<DtoAgent>();
}
当我把它称为../api/Agent?$top=10时,它返回的所有结果不仅仅是10.我可以在options变量中看到TopQueryOption,但似乎没有得到应用。如果我使用[Queryable]属性但顶部是在DB调用之后应用的,这是我想要避免的。我在全局级别调用EnableQuerySupport并安装了Nuget包和2012.2更新。谢谢你的帮助。
答案 0 :(得分:3)
你遗漏了一些简单的东西。当您调用ApplyTo时,它不会改变IQueryable,它会返回应用的查询。所以这样的事情应该起作用:
var queryResults = options.ApplyTo(agents) as IQueryable<Agent>;
return queryResults.ToDtos<DtoAgent>();