【发布时间】:2015-07-20 09:49:04
【问题描述】:
OData (listed here) 的限制使我无法从我的 OData 源向数据集添加动态 where 子句。我找到了一个previous post,它回答了我对动态过滤器的查询,即使用带有自定义构建查询字符串的 AddQueryOption 方法。但是,似乎没有办法将此查询字符串与标准 LINQ 查询结合起来。
使用上述方法产生一个有效的查询:
https://api-dev.company.com/odata/Assets?$filter=(Levels/any(l:l/LevelId eq 18)) or (Levels/any(l:l/LevelId eq 19))
之所以必须动态生成,是因为存在数量可变的级别过滤器,这些过滤器在运行时之前无法确定,并且简单地使用多个 Where 子句会生成“and”过滤器而不是“or”过滤器,如下所示:
https://api-dev.company.com/odata/Assets?$filter=(Levels/any(l:l/LevelId eq 18)) and (Levels/any(l:l/LevelId eq 19))
在此方法产生以下输出后,我当前尝试使用 LINQ:
https://api-dev.company.com/odata/Assets?$filter=DisplayOnline and Status eq Tools.Services.Models.EPublishStatus'Active', and (Levels/any(l:l/LevelId eq 18)) or (Levels/any(l:l/LevelId eq 19))
请注意,第二个查询的唯一问题是 Levels 过滤器和其余过滤器之间的逗号。
额外的Where子句如下:
// Filter by assets that can be displayed online
assets = assets.Where(a => a.DisplayOnline);
// Filter by assets that are active
assets = assets.Where(a => a.Status == EPublishStatus.Active);
我想知道是否有手动编辑字符串的方法,或者是否有适当的方法来组合两种查询字符串生成方法。感谢您的宝贵时间。
【问题讨论】: