OData 的限制(此处列出)阻止我向来自我的 OData 源的数据集添加动态 where 子句。我发现以前的帖子回答了我对动态过滤器的查询,即使用 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))
Run Code Online (Sandbox Code Playgroud)
必须动态生成的原因是因为在运行时之前无法确定可变数量的级别过滤器,并且只需使用多个 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))
Run Code Online (Sandbox Code Playgroud)
在此方法产生以下输出后,我当前尝试使用 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))
Run Code Online (Sandbox Code Playgroud)
请注意,第二个查询的唯一错误是 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 == …Run Code Online (Sandbox Code Playgroud)