Aeg*_*gis 4 .net c# linq odata
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 == EPublishStatus.Active);
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一种方法可以手动编辑字符串,或者是否有一种将两种查询字符串生成方法结合起来的正确方法。谢谢你的时间。
经过一些试验和错误,我发现利用此处回答的解决方案 有助于解决此问题。我的解决方案是在 LINQ 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);
// Addtional filters..
assets = assets.Where(a => x == y);
// Get the string for the dynamic filter
string dynamicQuery = GetDynamicQuery(assets);
// Get base OData Asset call (https://api-dev.company.com/odata/Assets)
IQueryable<Asset> serviceCall = _container.Assets;
// Apply the new dynamic filter
serviceCall = serviceCall.AddQueryOption("$filter", dynamicQuery);
// Resultant OData query (Success!)
https://api-dev.company.com/odata/Assets?$filter=DisplayOnline and Status eq Models.Status'Active' and (Levels/any(l:l/LevelId eq 18)) or (Levels/any(l:l/LevelId eq 19))
Run Code Online (Sandbox Code Playgroud)
这里的技巧是确保查询中只有一个“$filter”选项,否则会抛出异常。