【发布时间】:2013-07-24 18:48:36
【问题描述】:
使用这种技术 (How to dynamic add filters to a LINQ query against an Odata Source in C#),我在 LINQ 查询中动态构建了一个 where 子句,用于连接我的 Odata 端点。我经常这样做,效果很好。但是现在我的查询包含一些 odata v3.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 时,它有一个 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?
有谁知道有什么可以帮忙的吗?
【问题讨论】:
标签: c# linq wcf-data-services odata