2014-02-06 168 views
0

OData的$排序依據條款,我有以下類別:在集合屬性

public class Parent 
{ 
    public string ParentProp { get; set; } 
    public IEnumerable<Child> ManyChildren { get; set; } 
} 

public class Child 
{ 
    public string ChildName { get; set; } 
    public int Value { get; set; } 
} 

說我有一個定義的OData操作返回IEnumberable<Parent>。我可以寫一個$orderby條款執行以下操作(「父母」是IEnumerable<Parent>):

parents.OrderBy(x => x.ManyChildren.Single(y => y.ChildName == "Child1").Value); 

我知道我可以編寫自定義操作(http://msdn.microsoft.com/en-us/library/hh859851(v=vs.103).aspx)來完成此排序適合我,但我寧願使用一個$orderby子句。 (問這個問題的唯一問題有點過時了 - How can I order objects according to some attribute of the child in OData?

回答

0

這取決於你的OData服務實現。你使用哪種服務? WCFDS,WebAPI或您自己實施的服務?

Url解析器可以解析URL,例如root/People?$ orderby = Company/Name。翻譯是通過服務來實現的。

我同意在相關問題中的答案:「不可能用具有許多基數的導航屬性來做到這一點。由於它具有很多基數,因此服務無法知道應該使用哪一個排序。

1

正如我試過可以在$嵌套$排序依據擴大等都將成爲:

odata/User?&$select=Active,Description,Name,UserId&$expand=Company($select=Active,Name,CreatedBy,CompanyId;$orderby=Active asc) 

而你得到的是財產以後這樣的:

ORDER BY [Project2].[UserId] ASC, [Project2].[C19] ASC 

將責令公司集合爲每個用戶分別。

我認爲是支持版本的OData客戶端.NET 6.7.0,在發行說明中扭動着:

在查詢選項 $ ID,$選擇,$擴展(包括嵌套查詢選項)... 。

我在6.1的版本,嵌套期權存在值,是看到:

DataQueryOptions-> SelectExpand-> SelectExpandClasue-> SelectedItems-> ExpandNavigationItem-> OrderByOption

但不幹活G。

我試過,並與System.Web.OData 5.6和所有相關的依賴關係,但接縫不工作。

我的結論:即everiting準備像DataQueryOptions

煤層存在嵌套排序依據,但不能正常工作。

就像我發現標準接縫正在朝着這個方向發展。 https://issues.oasis-open.org/browse/ODATA-32