2012-10-15 26 views
2

我開始在我的MVC4應用程序和我有問題使用OData的排序依據複雜的類型,是我不能因爲我使用複雜的對象在我的IQueryable進行任何排序或篩選操作。下面是我想做到的事情一個簡單的例子:使用OData的

我的API控制器試圖返回MyObjects的集合作爲IQueryable的。

public IQueryable Get() 
{ 
    List<MyObject> myObjects = GetMyObjects(); 
    return myObjects.AsQueryable() ; 
} 

每個myObject的包含有我想要排序和/或過濾的性能的InnerObject。

public class MyObject 
{ 
    [Key] 
    public MyInnerObject innerObject{ get; set; } 

    public MyObject(Dictionary<string, object> value) 
    { 
     innerObject= new MyInnerObject(){ 
      item = value["item"].ToString(), 
      itmdesc = value["itmdesc"].ToString() 
     }; 
    } 
} 

public class MyInnerObject 
{ 
    public string item { get; set; } 
    public string itmdesc { get; set; } 
} 

我可以成功地通過URL

localhost:5050/Test/Get?$top=10 

但我真的希望能夠使用

localhost:5050/Test/Get?$top=10&$orderby=innerObject.item 

我已經盡了排序結果執行上面的命令

localhost:5050/Test/Get?$top=10&$orderby=innerObject.item 
localhost:5050/Test/Get?$top=10&$orderby=innerObject/item 
localhost:5050/Test/Get?$top=10&$orderby=item 

任何建議蒸發散?

編輯:

我應該指出,它的工作原理,如果我把內MyObject來的項目和itmdesc屬性,但我的目的(這是我的複雜的實體的只是一個縮小的版本),他們將需要被包裹在一個複雜的類型。

在我的API控制,我也嘗試過的IQueryable <爲MyObject>但是,這並不有所作爲

回答

4

一般來說,OData的一個協議允許你試過第二件事(localhost:5050/Test/Get?$top=10&$orderby=innerObject/item)。這可能是OData的Web API實現的暫時性限制(假設您正在使用基於您的環境的其餘部分和返回的IQueryable)。

+0

是的,我只是不明白。當我在對象名稱周圍添加單引號時,$ filter工作。試過,orderby和...一樣沒有。 –

1

ASPNET的Web API的OData不通過嵌套屬性或表達式支持排序。在codeplex上打開issue以支持嵌套屬性的排序。

但是,如果您有點冒險,可以使用ODataQueryOptions來模型綁定單個odata查詢選項,然後將$ orderby AST轉換爲linq表達式並將其手動應用到您的IQueryable。

+0

這仍然是一件事嗎?鏈接頁面意味着請求已關閉,嵌套屬性的排序應該在客戶端完成。服務器端分頁場景沒有多大幫助... – ceej