我有点困惑,需要一些帮助。拿这两个班级
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语句好像不起作用!它只是以默认的排序顺序返回我的列表。关于我如何使这项工作的任何建议??? 提前谢谢!
答案 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();
当然,如果Comments
为List<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;