2013-06-26 66 views
3

我正在使用OData和web api,並嘗試根據類型細節進行查詢。我想要的是提供一個類似於這樣的查詢(粗體文本在句法上不正確,但描述了在聲明該類型之後我要做的事情):使用odata函數isof with web api

../Supplier?$ filter = ISOF(產品,namespace.ToyProduct) & Product.ratedAge EQ 5

但是當我嘗試用[可查詢]屬性這樣做的,從ODataController繼承我得到方法不支持錯誤與問候該等。有什麼方法可以支持該方法嗎?我曾嘗試將AllowedFunctions.All添加到Queryable屬性,但這不起作用。

我能夠使用ODataQueryOptions來檢查過濾器中是否包含isof,並使用我自己的方法進行檢查,但是它非常混亂,並且在允許額外過濾後可能會變得更糟,如果存在更好的解決方案!

未編譯的代碼,因爲它目前爲:

public class SupplierController : ODataController { 
    [Queryable(AllowedFunctions = AllowedFunctions.All)] 
    public PageResult<Supplier> Get(ODataQueryOptions<Supplier> queryOptions) { 

     // doesn't work, method not supported 
     //var queryableSuppliers = queryOptions.ApplyTo(_repository.All()); 

     // works but messy method. 
     var queryableSuppliers = MyIsOfMethod(queryOptions.Filter) 

     return new PageResult<ObjectType>(
      results as IEnumerable<ObjectType>, 
      Request.GetNextPageLink(), 
      Request.GetInlineCount()); 

    } 
} 
+0

我有一個解決方案,以模擬「isof」函數來調用查詢的「OfType」調用。代碼見https://github.com/schungx/WebApi-OData。 –

回答

1

我們不支持在網頁API ISOF和轉換函數。我們反而使用單獨的段支持新的轉換語法。您的查詢應該是這樣的新語法,

../Supplier?$filter=Product/namespace.ToyProduct/ratedAge eq 5

+0

你能否提供一個關於這個新語法的文檔的鏈接以及如何使用它?我與OP有同樣的問題,但我無法設法使您的建議工作。我正在使用'isof'函數的另一個「重載」,它只使用單引號中的完全限定類型名稱。另外,首先不支持它的原因是什麼? – julealgon

1

我不認爲答案與之相匹配的問題。 有問題的原始查詢爲:

../Supplier?$filter=isof(Product, namespace.ToyProduct)&Product.ratedAge eq 5 

我想這實際上意味着是:

../Supplier?$filter=isof(Product, namespace.ToyProduct)%20and%20Product.ratedAge eq 5 

無論如何,這是過濾器在特定的派生類型及其子類型來檢索實體。 答案並沒有這樣做。