【发布时间】:2015-08-16 23:57:57
【问题描述】:
我已经实现了一个通过 WebAPI OData 端点公开的自定义 IQueryable。控制器的 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 来防止这种双重应用跳过?
编辑: 经过进一步调查,当我按预期从查询字符串跳过(和顶部)函数中删除 $count=true 时。这让我相信我实现 $count=true 的方法是不正确的。从我的调试会话中可以看出,当 $count=true 在查询选项中时,可查询的表达式树应用了两次,一次返回类型为 long,然后再次没有包装 countlong 表达式。我尝试在第一遍返回计数,然后在第二遍中正确查询,但这会导致跳过表达式的延迟应用。这里似乎缺少一些非常基本的东西。
【问题讨论】:
标签: c# asp.net-web-api odata iqueryable