2011-12-02 132 views
3

我想在下面的例子中,當我打電話Load()添加一個排序依據:訂單通過實體框架加載

(注:此對象已加載其他地方的EF文章)

private string GetTags() 
    { 
     var tags = this.Article.tags; 
     if (!tags.IsLoaded && this.Article.EntityState != EntityState.Detached) 
     { 
      tags.Load(); 
      tags.OrderBy(t => t.name); 
     } 

     StringBuilder result = new StringBuilder(); 
     foreach (var tag in tags) 
     { 
      result.Append(tag.name).Append(" "); 
     } 
     return result.ToString(); 
    } 

問題是這是不按alphebetical順序排序標籤。我錯過了什麼?

回答

2

與大多數其他LINQ方法一樣,OrderBy不會影響不可變的基礎查詢。你必須用它做什麼返回值:

this.Article.tags = tags.OrderBy(t => t.name); 

的問題是,tags不是一個IEnumerable或IQueryable的:它是一個EntityCollection。所以上述說法不會很好。此外,您的方法名稱(GetTags)不能很好地表明您要修改Article對象上的標籤順序,所以最好保留OrderBy本地,並且每次都重新執行一次有人叫GetTags

var tags = this.Article.tags; 
    if (!tags.IsLoaded && this.Article.EntityState != EntityState.Detached) 
    { 
     tags.Load(); 
    } 

    return string.Join(" ", tags.Select(t => t.name).OrderBy(t => t)) 
+0

當我做'this.Article.tags.Load()'時,我可以orderby嗎? –

+1

@DMoses:有一些技巧可以在急切加載時正常工作(http://blogs.msdn.com/b/alexj/archive/2009/02/25/tip-1-sorting-relationships -in-entity-framework.aspx),但我不知道有什麼辦法可以像這樣對一個'OrderBy'進行延遲加載。當然,您可以只執行一個單獨的查詢來獲取與您所在文章綁定的標籤,並將它們作爲查詢的一部分進行排序,但不會自動將它們加載到「Article.tags」屬性中。 – StriplingWarrior

3

你未分配tags.OrderBy()到任何東西,將其設置爲另一個變量和遍歷的是,如

var orderedTags = tags.OrderBy(t => t.name) 
... 
foreach(var tag in orderedTags) { 
.... 
} 
+0

打我也是脫衣舞娘! – dougajmcdonald