2013-01-08 89 views
1

我试图检索由一个DateTime与Linq订购的记录到实体,但我也需要它们作为不同的记录。Linq to Entities查询以选择最新的,不同的记录

我的表的设计是这样的:

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

但后来我做的这是不是很优雅组之前获得所有的意见,也没有高性能。

任何帮助,非常感谢!

+0

刚刚发现这个“问题”。你应该有“通过编辑回答你自己的问题”一节,澄清你找到了答案。这有助于他人(并增加你的代表点!)。 – SilentNot

回答

1

你可以这样既包括了排序依据语句和声明的GroupBy成一个单一的语句:

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

如果表现不好,你可以通过一个Singleton缓存在HttpCache您的DataContext。示例见this blogpost。这是基于Umbraco DataContext的,但可以很容易地修改为使用其他类型的上下文。