2011-12-02 130 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