0

使用这种技术(如何在 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?

有人知道有什么可以帮助的吗?

4

1 回答 1

1

这就是我发现的工作。基本上我只是挂钩和覆盖 HTTP 标头

MyDatacontext.SendingRequest2 += (sender, eventArgs) => {                 
           eventArgs.RequestMessage.SetHeader("DataServiceVersion", "3.0;NetFx");
    };

我正在使用 WCF 5.0,所以正在使用 SendingRequest2 ,但是如果使用旧版本,您可能会使用折旧的 SendingRequest 或 BuildingRequest 事件。

于 2013-07-24T23:43:11.517 回答