2013-12-09 40 views
0

首先,我遇到了Entity Framework 5代码的排序问题。我创建了一个不大不小的论坛,有两个班在我的模型:EF按项目属性或子项属性进行排序取决于具体情况

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

消息有一个名为Comments的导航集合,EF Code First和相关配置可以很好地处理它。

在论坛的主页中,我试图通过他们的最后评论日期排序消息,以便将最后评论的消息放在最前面。我写了这样的代码:

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

问题是,当我发布新消息时,它没有评论,所以它在页面的底部。我想结合最后的排序方法与.OrderByDescending(m => m.Datepost)我以前不适合我的需求了...

任何帮助吗? :-)

谢谢!

回答

0

井LINQ到对象,你只想做:

_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(); 
+1

我不会考虑实现列表解决方案.. – Moeri

+0

我相信第一个查询可以在EF中工作而无需实现解决方案(它至少与我正在使用的类似数据集一样)。 – Ocelot20

+0

@Moeri无论如何都通过'ToList()'来实现 - 它只是在客户端而不是SQL中进行排序。 –

1

这个怎么样?

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

这对我有用,谢谢!我终于选择了斯坦利的解决方案,我更喜欢没有日期时间? cast –