2013-07-24 48 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事件。

相關問題