【发布时间】:2010-04-19 19:33:39
【问题描述】:
我有一个星期一的案子......
我需要根据帖子的 cmets 集合中的最近活动选择博客帖子(帖子具有 List<Comment> 属性,同样,评论具有帖子属性,建立关系。我不想显示相同的发了两次,我只需要实体的一个子集,而不是所有的帖子。
首先想到的是抓取所有包含 cmets 的帖子,然后根据最新评论对这些帖子进行排序。为此,我很确定我必须将每个帖子的 cmets 限制为第一个/最新的评论。最后,我只需选择前 5 个(或我想传递给方法的任何最大结果数)。
第二个想法是抓取由 CreatedOn 排序的所有 cmets,然后过滤,以便每个帖子只有一个评论。然后返回那些顶部(无论如何)帖子。这似乎和第一个选项一样,只是通过后门。
我有一个丑陋的两个查询选项,我在旁边使用了一些 LINQ 进行过滤,但我知道使用 NHibernate API 有一种更优雅的方法。希望在这里看到一些好的想法。
编辑:到目前为止,这对我有用。虽然它有效,但我确信有更好的方法来做到这一点......
// get all comments ordered by CreatedOn date
var comments = Session.CreateCriteria(typeof(Comment)).AddOrder(new Order("CreatedOn", false)).List<Comment>();
var postIDs = (from c in comments select c.ParentPost.ID).Distinct();
// filter the comments
List<Post> posts = new List<Post>();
foreach(var postID in postIDs)
{
var post = Get(postID); // get a Post by ID
if(!posts.Contains(post)) // this "if" is redundant due to the Distinct filter on the PostIDs collection
{
posts.Add(post);
}
}
return posts;
【问题讨论】:
标签: c# sql nhibernate