EF根据情况按项目属性或子属性进行排序

时间:2013-12-09 14:30:45

标签: asp.net-mvc linq entity-framework linq-to-sql

我首先遇到了Entity Framework 5代码的排序问题。我正在创建一个论坛,我的模型中有两个类:

  • 消息(MessageId,DatePost,标题,内容)
  • 评论(CommentId,DatePost,Content,MessageId)

Messages有一个名为Comments的导航集合,由EF Code First和相关配置很好地处理。

在论坛的主页面中,我正在尝试按照上次评论日期对邮件进行排序,以便将最后评论的邮件放在最上面。我写了这段代码:

_messageRepository
            .GetAll()
            .OrderByDescending(m => m.Comments.Max(c => c.DatePost))
            .ToList();

问题在于,当我发布新消息时,它没有评论,因此它位于页面底部。我想将最后的排序方法与之前的.OrderByDescending(m => m.Datepost)结合起来,不再适合我的需求...

有任何帮助吗? : - )

感谢的!

2 个答案:

答案 0 :(得分:1)

这个怎么样?

_messageRepository
    .GetAll()
    .OrderByDescending(m => m.Comments.Max(c => (DateTime?)c.DatePost)
        ?? m.Datepost)
    .ToList();

答案 1 :(得分:0)

在Linq-to-Objects中,您可以做到:

_messageRepository
            .GetAll()
            .OrderByDescending(m => m.Comments.Any() 
                                  ? m.Comments.Max(c => c.DatePost)
                                  : m.Datepost)
            .ToList();

但是EF可能无法将其转换为SQL。您可以首先实现列表,然后调用.OrderBy

_messageRepository
            .GetAll()
            .AsEnumerable()
            .OrderByDescending(m => m.Comments.Any() 
                                  ? m.Comments.Max(c => c.DatePost)
                                  : m.Datepost)
            .ToList();