使用這種技術(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?
有沒有人知道任何可以幫助?