1

我可能遗漏了一些简单的东西,但根据这篇博文: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 更新。谢谢你的帮助。

4

1 回答 1

4

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

var queryResults = options.ApplyTo(agents) as IQueryable<Agent>;
return queryResults.ToDtos<DtoAgent>();
于 2013-04-18T16:17:59.807 回答