使用这种技术(如何在 C# 中针对 Odata 源动态添加过滤器到 LINQ 查询)我在 LINQ 查询中动态构建了一个 where 子句到我的 Odata 端点。我经常这样做,效果很好。但是现在我的查询包含一些 odata v3.0 功能,我收到了这个错误。
DataServiceVersion '1.0' 对于请求来说太低了。支持的最低版本是“3.0”
我已经使用位于的唯一北风端点构建了一个简单的复制品,并且可以在标准 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 时,它有一个 MaxProtocolVersion 表示 V3,当然我的项目是 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 功能,从而提出了“最低公分母” “引擎可以从它可以识别的查询部分中解决问题,所以同样有一些 V3 功能我可以在 Select 中使用,或者另一个子句只是为了强制查询实际上是 V3?
有人知道有什么可以帮助的吗?