使用Entity Framework Load时的Order by

4
我希望在以下示例中调用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();
    }

问题是这不会按字母顺序排序标签。我错过了什么吗?

2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
3

你还没有将tags.OrderBy()分配给任何东西,将它设置为另一个变量并对其进行迭代,例如:

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

2

与大多数其他LINQ方法一样,OrderBy不会影响底层查询,即不可变的。您必须对其返回的值进行操作:

this.Article.tags = tags.OrderBy(t => t.name);
问题在于,tags不是一个IEnumerable或IQueryable类型:它是一个EntityCollection。因此,上述语句效果不佳。此外,您的方法名称(GetTags)并没有很好地表明您将修改
对象上的标记顺序,因此最好只保留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))

当我执行 this.Article.tags.Load() 时,我可以按照顺序排序吗? - Daniel Moses
1
@DMoses:当使用急切加载时,有一些技巧可以使其正常工作(http://blogs.msdn.com/b/alexj/archive/2009/02/25/tip-1-sorting-relationships-in-entity-framework.aspx),但我不知道如何对这样的惰性加载应用`OrderBy`。当然,您可以执行单独的查询以获取与您正在查看的文章相关联的标签,并将它们作为查询的一部分进行排序,但这不会自动加载到`Article.tags`属性上。 - StriplingWarrior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,