2

我有点困惑,需要一些帮助。上这两个课

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 语句似乎不起作用!它只是以默认排序顺序返回我的列表。关于如何使这项工作的任何建议???提前致谢!

4

5 回答 5

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);

IE

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)));
}
于 2009-01-15T10:45:56.303 回答
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;
于 2009-01-15T10:46:05.600 回答
1

这将返回一个 IEnumerable 集合,它不是一个可比较的值:

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

试试这个:

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

返回最新评论的日期

于 2009-01-15T10:46:45.660 回答
0

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

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

.

于 2009-01-15T10:51:14.107 回答
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;
于 2009-01-15T10:54:49.233 回答