将LINQ与OData结合使用AddQueryOption

将LINQ与OData结合使用AddQueryOption

问题描述:

OData的限制(listed here)阻止我将动态where子句添加到来自OData源的数据集。我发现了一个previous post,它回答了我对动态过滤器的查询,即将AddQueryOption方法与定制的查询字符串一起使用。但是,似乎没有办法将此查询字符串与标准LINQ查询结合起来。将LINQ与OData结合使用AddQueryOption

使用上述方法产生一个有效的查询:

https://api-dev.company.com/odata/Assets?$filter=(Levels/any(l:l/LevelId eq 18)) or (Levels/any(l:l/LevelId eq 19)) 

这具有被监守有不能运行时间之前来确定级别过滤器的可变数目和简单地使用多个何处被动态地产生的原因条款生产“和”过滤器,而不是“或”过滤器,这样的:

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); 

我想知道是否有手动编辑字符串的方式或者如果有两个查询字符串生成方法相结合之有道。谢谢你的时间。

经过一些试验和错误,我发现利用解决方案answered here帮助解决了这个问题。对我来说,解决方案是构建动态过滤查询LINQ AFTER 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)) 

诀窍是确保只有一个查询中的“$ filter”选项,否则会引发异常。

它会给你一个错误,如果有一个DateTime过滤器where子句中已经存在调用GetDynamicQuery(assets); 错误会是这样使用新的URL请求message=The time zone information is missing on the DateTimeOffset value '2016-09-20T23:54:23.4531408'. A DateTimeOffset value must contain the time zone information. 我已经张贴quation在打电话给OData的网络API时,像以前一样这link