小编Bil*_*rry的帖子

WebAPI OData $跳过自定义IQueryable double应用

我已经实现了一个通过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.例如:

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

我想要做的是阻止框架将Skip应用于我的结果集,因为查询提供程序已经实现了跳过.是否有ODataQuerySettings可以设置为防止跳过此双重应用程序?

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

c# iqueryable odata asp.net-web-api

7
推荐指数
1
解决办法
2324
查看次数

从Powershell调用vcvarsall.bat后运行构建脚本

我试图运行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会话并适当延迟了环境变量的扩展?也许这种方法是错误的...

c powershell cmd build visual-studio

1
推荐指数
1
解决办法
1063
查看次数

标签 统计

asp.net-web-api ×1

build ×1

c ×1

c# ×1

cmd ×1

iqueryable ×1

odata ×1

powershell ×1

visual-studio ×1