ODataQueryOptions未应用

时间:2013-04-18 15:43:49

标签: asp.net-web-api odata

我可能会遗漏一些简单但基于这篇博文: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更新。谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

你遗漏了一些简单的东西。当您调用ApplyTo时,它不会改变IQueryable,它会返回应用的查询。所以这样的事情应该起作用:

var queryResults = options.ApplyTo(agents) as IQueryable<Agent>;
return queryResults.ToDtos<DtoAgent>();