我已经实现了一个通过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);
}
Run Code Online (Sandbox Code Playgroud)
我看到的奇怪的行为是,在返回PageResult后应用查询字符串中的OData $ Skip.例如:
我想要做的是阻止框架将Skip应用于我的结果集,因为查询提供程序已经实现了跳过.是否有ODataQuerySettings可以设置为防止跳过此双重应用程序?
编辑:进一步调查,当我从查询字符串skip(和top)函数中删除$ count = true时,按预期方式.这让我相信我实现$ count = true的方法是不正确的.从我的调试会话中可以看出,当$ count = true在查询选项中时,queryable将表达式树应用于它两次,一次返回类型为long,然后再次没有包装countlong表达式.我已尝试在第一次传递时返回计数,然后在第二次传递时返回正确的查询,但这会导致跳过表达式的延迟应用.这里似乎有一些非常基本的东西.
我试图运行Visual Studio(开发人员cmd提示符)环境变量安装批处理文件,然后从Powershell脚本中运行生成脚本,如下所示:
cmd /v:on/k "(""C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"" amd64_x86 && C:\buildscript.cmd --build-options)"
但是,似乎vcvarsall.bat建立的环境设置并未保留给构建脚本调用。即没有默认的编译器设置,等等。
/v:on与/k交换机结合使用时,实际上是否没有利用相同的cmd会话并适当延迟了环境变量的扩展?也许这种方法是错误的...