Asp.net web api 未应用ODataQueryOptions

Asp.net web api 未应用ODataQueryOptions,asp.net-web-api,odata,Asp.net Web Api,Odata,我可能遗漏了一些简单的东西,但基于这篇博文:这应该是有效的。我有以下控制器方法: public virtual IQueryable<DtoAgent> Get(ODataQueryOptions<Agent> options, bool includeInactive = false, bool includeDeleted = false) { IQueryable<Agent> agents = null; if

我可能遗漏了一些简单的东西,但基于这篇博文:这应该是有效的。我有以下控制器方法:

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]属性,它就可以工作,但是top是在DB调用之后应用的,这正是我试图避免的。我正在全球级别调用EnableQuerySupport,并已安装Nuget软件包和2012.2更新。谢谢你的帮助。

你错过了一些简单的东西。调用ApplyTo时,它不会改变IQueryable,而是返回应用的查询。因此,类似的方法应该起作用:

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

你错过了一些简单的东西。调用ApplyTo时,它不会改变IQueryable,而是返回应用的查询。因此,类似的方法应该起作用:

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