2013-07-24 49 views
0

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

有没有人知道任何可以帮助?

回答

1

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

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

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

相关问题