c# - WebAPI OData $Skip 自定义 IQueryable 双应用

标签 c# asp.net-web-api odata iqueryable

我已经实现了通过 WebAPI OData 端点公开的自定义 IQueryable。 Controller 的 Get() 的结构是相当标准的:

[EnableQuery(
    AllowedQueryOptions = AllowedQueryOptions.Count
                          | AllowedQueryOptions.Filter
                          | AllowedQueryOptions.OrderBy
                          | AllowedQueryOptions.Skip
                          | AllowedQueryOptions.Top)]
[ODataRoute]
public PageResult<Foo> Get(ODataQueryOptions<Foo> queryOptions)
{

    var bars = new QueryableData<Foo>(_provider);

    var result = ((IQueryable<Foo>)queryOptions
        .ApplyTo(bars,
            new ODataQuerySettings(new ODataQuerySettings { EnableConstantParameterization = false, EnsureStableOrdering = false }))).ToList();
    var count = _provider.Count;
    return new PageResult<Foo>(result, null, count);
}

我看到的奇怪行为是在返回 PageResult 后应用查询字符串中的 OData $Skip。例如:

  • 如果查询字符串包含 ?$top=10&$skip=10 则不会返回任何结果。
  • 如果查询字符串包含 ?&top=12&skip=10,将返回 (2) 个结果。

我想要做的是阻止框架将 Skip 应用于我的结果集,因为查询提供程序已经实现了 skip。是否可以设置 ODataQuerySettings 以防止这种重复应用 skip?

编辑: 经过进一步调查,当我按预期从查询字符串跳过(和顶部)函数中删除 $count=true 时。这让我相信我实现 $count=true 的方法是不正确的。从我的调试 session 看来,当 $count=true 在查询选项中时,可查询对象将表达式树应用于它两次,一次返回类型为 long,然后再次没有包装 countlong 表达式。我试过在第一次通过时返回计数,然后在第二次通过时返回适当的可查询,但这会导致跳过表达式的延迟应用。我在这里似乎缺少一些非常基本的东西。

最佳答案

在阅读 Github 问题列表时,我看到了这篇文章:OData PageResult method ignoring count parameter when using EnableQuery attribute #159 .问题似乎是 EnableQuery Attribute 和采用 ODataQueryOptions 的参数化 Get 构造函数的组合。使用两者意味着您将实现构造函数查询选项,应用查询表达式,然后框架将应用它可以根据应用属性的方向进行的过滤器;因此双重应用诸如 skip、top 和 orderby 之类的东西。

关于c# - WebAPI OData $Skip 自定义 IQueryable 双应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30608837/

相关文章:

c# - "The property {property} does not exist on type {type}"- 但确实如此。 OData 配置问题?

javascript - 发布.net core 2.0网站时出现HTTP 500

c# - 在处理完消息之前不要收听 Windows 服务

c# - 基于 Linq 构建复杂搜索过滤器

c# - C#查找数字是否在范围内的更优雅的方法

asp.net-mvc - 为什么 ASP.NET MVC WebAPI 模板使用 DbContext 作为成员变量?

javascript - 使用 Javascript 插件作为客户端进行 Web API 的身份验证和授权

asp.net-web-api - 对于 fetchXml 查询类型,请求 URL 太长

javascript - 如何使用Javascript对Account以外的实体执行CRUD操作

odata - 在 Web API 2.2 上将 $select 和 $expand 与 Odata v4.0 一起使用时出错