Linq to Entities查询以选择最新的,不同的记录

时间:2013-01-08 17:04:49

标签: entity-framework linq-to-entities umbraco

我正在尝试将带有Linq的DateTime订购的记录检索到实体,但我也需要它们作为不同的记录。

我的表格设计如下:

enter image description here

其中blogItemNodeId是Umbraco CMS节点(可以创建评论的博客项目节点)

要求是博客项目列表可以按他们有多少评论进行排序。因此,我需要通过blogItemNodeId获取最新的评论,以显示这些博客项目。

我当前的linq查询如下所示:

var distinctComments = (from c in ctx.BlogComments
                        orderby c.date
                        group c by c.blogItemNodeId
                        into uniqueRecords
                        select uniqueRecords.FirstOrDefault());

此查询的问题在于它找到第一个(因此FirstOrDefault())记录,其中包含不同的blogItemNodeId,其中应该找到具有相同blogItemNodeId的所有注释中最新的记录

有谁知道如何实现这一目标? : - )

提前多多感谢。

修改

我设法通过这样做来实现它:

var allComments = (from c in ctx.BlogComments
                   orderby c.date descending
                   select c).ToList();

var distinctComments = allComments.GroupBy(x => x.blogItemNodeId).Select(y => y.FirstOrDefault());

但是在做这个不太优雅也不高效的小组之前,我必须得到所有的评论。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

您可以将orderBy语句和GroupBy语句组合成一个语句,如下所示:

var distinctComments = ctx.BlogComments.OrderBy(c => c.date)
                        .GroupBy(x => x.blogItemNodeId)
                        .Select(y => y.FirstOrDefault());

如果性能不好,您可以通过Singleton将您的DataContext缓存在HttpCache中。有关示例,请参阅this blogpost。这基于Umbraco DataContext,但可以轻松修改以用于其他类型的上下文。