使用这种技术(How to dynamic add filters to a LINQ query against an Odata Source in C#)我动态地在我的Odata端点的LINQ查询中建立一个where子句。我经常这样做,而且效果很好。不过,现在我的查询包含一些odata v3.0功能,并且出现此错误。DataServiceVersion冲突:对于请求,DataServiceVersion'1.0'太低。支持的最低版本是'3.0'
对于请求,DataServiceVersion'1.0'太低。最低支持版本是'3.0'
我已经建立了一个简单的复制使用唯一的northwind端点在,并且可以在标准C#代码或linqpad中复制它。
罗斯文端点:http://services.odata.org/Northwind/Northwind.svc/
查询的作品。
from x in Categories
where x.Products.Any(e => e.ProductName == "chai")
select x
查询生成的URL。
http://services.odata.org/Northwind/Northwind.svc/Categories()?$filter=Products/any(e:e/ProductName eq 'chai')
这里是查询,如果我有动态生成的where子句(正如我在上面链接的技术做)
from x in Categories.AddQueryOption("$filter", "Products/any(e:e/ProductName eq 'chai')")
select x
但是现在我得到的错误。
当我看看我的DataServiceContext时,它有一个说V3的MaxProtocolVersion,当然我的项目是dotnet 4.5,而普通的查询正在工作。
因此,我认为正在发生..是服务器支持V3功能,并且我正在使用它,但客户端必须查看LINQ查询并将其DataServiceVersion标识为用于特征的最小公分母该查询,因为我使用V3功能,但只在动态部分,它不能推理,它认为我只使用V1功能..
如果我使用V2功能(投影)在选择如下
from x in Categories.AddQueryOption("$filter", "Products/any(e:e/ProductName eq 'chai')")
select new { x.CategoryID, x.CategoryName }
然后我得到一个稍微不同的错误
DataServiceVersion'2.0'对请求来说太低。支持的最低版本是'3.0'。有关更多详情,请参阅下面的例外。
这似乎支持我的假设..
这样我就可以看到2个解决方案 1)好歹告诉DataServiceContext或发动机强制客户端识别查询作为V3,或者像上面我在查询的选择中使用了V2功能,从而引出了引擎可以从查询中可以识别的部分中找出的“最低公分母”,所以同样有一些我可以在Select中使用的V3功能,或者另一个条款只是强制查询实际上是V3?
有没有人知道任何可以帮助?