在类聚合关系上帮助linq orderby

时间:2009-01-15 10:36:27

标签: c# linq-to-objects

我有点困惑,需要一些帮助。拿这两个班级

public class Comment
{
     public string Message {get; set;}
     public DateTime Created {get; set;}
}

public class Post
{
    public int PostId {get; set;}
    public string Content {get; set;}
    public IList<Comment> Comments {get; set;}
}

我想编写一个linq查询,该查询返回单个帖子,但是按评论创建日期排序。

所以我开始构建我的linq查询,如下所示:

var query = from p in _repository.GetPosts()
                        where p.PostId == id
                        orderby p.Comments.Select(x => x.Created)
                        select p;

            return query.Single();

但是orderby语句好像不起作用!它只是以默认的排序顺序返回我的列表。关于我如何使这项工作的任何建议??? 提前谢谢!

5 个答案:

答案 0 :(得分:4)

哪个评论日期订购?首先?最后?你试着试试:

orderby p.Comments.Max(x=>x.Created)

例如。

此外 - 您的Single建议您希望完全一行,在这种情况下,排序的点不多。你的意思是First()


或者您是否想要对Comments进行排序?在这种情况下,先获取Post;

Post post = ...

现在......排序Comments因为你的IList<T>而有点棘手 - 如果你不介意它有点低效,这很简单:

post.Comments = post.Comments.OrderBy(x=>x.Created).ToList();

当然,如果CommentsList<T>,您可以这样做:

post.Comments.Sort((x, y) => (x.Created.CompareTo(y.Created)));

您还可以使用一些技巧来制作表单的扩展方法:

post.Comments.Sort(x=>x.Created);

public static void Sort<TSource, TKey>(
    this List<TSource> source,
    Func<TSource, TKey> selector)
{
    var comparer = Comparer<TKey>.Default;
    source.Sort((x, y) => comparer.Compare(selector(x), selector(y)));
}

答案 1 :(得分:1)

您的orderby投影返回IEnumerable<DateTime> - 听起来不太可能是您想要的。

帖子有很多评论 - 你想把哪一个作为使用创建日期进行排序的评论?我的猜测是第一个:

var query = from p in _repository.GetPosts()
                    where p.PostId == id
                    orderby {
                        Comment comment = p.Comments.FirstOrDefault();
                        return comment == null ? DateTime.MinValue : comment.Created;
                    }
                    select p;

答案 2 :(得分:1)

这将在IEnumerable集合中返回,该集合不是可比较的值:

p.Comments.Select(x => x.Created)

请改为尝试:

p.Comments.Max(x => x.Created)

返回最近评论的日期

答案 3 :(得分:0)

如果要对结果列表进行排序,可以在获取帖子后执行以下操作:

p.Comments = p.Comments.OrderBy(x => x.Created).ToList();

答案 4 :(得分:0)

问题是你试图按评论创建日期列表对帖子列表进行排序,而不是对评论列表进行排序。

如果我已正确阅读您的问题,我假设您想要发布单个帖子,然后在该帖子中订购评论。请尝试以下操作:

var query = from p in _repository.GetPosts()
            where p.PostId == id
            orderby p.Comments.Select(x => x.Created)
            select p;

var ret = query.Single();
ret.Comments = ret.Comments.OrderBy(x => x.Created).ToList();
return ret;