代码之家  ›  专栏  ›  技术社区  ›  nkirkes

基于子实体活动的nhibernate实体选择

  •  1
  • nkirkes  · 技术社区  · 14 年前

    我有个星期一的案子…

    我需要根据文章的评论集合中最近的活动来选择博客文章(一篇文章有 List<Comment> 属性,同样,注释有一个post属性,用于建立关系。我不想显示同一个帖子两次,我只需要一个子集的实体,而不是所有的帖子。

    第一个想法是抓取所有有评论的帖子,然后根据最近的评论来排序。为了让这一点起作用,我非常确定我必须将每个帖子的评论限制在第一个/最新的评论。最后,我只需要取前5个(或者我想传递给方法的最大结果数)。

    第二个想法是获取createdon排序的所有评论,并进行过滤,这样每个帖子只有一条评论。然后把那些最上面的(随便什么)柱子还给我。这看起来和第一个选择一样,只是从后门进去。

    我有一个丑陋的,两个查询选项,我用一些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;
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   Chris Marisic    14 年前

    这是使用 NHibernate.LambdaExtensions 但是应该很容易转换成标准条件查询或hql查询。

    var query1 = DetachedCriteria.For<Post>()
        .CreateCriteria<Post>(x => x.Comments)
        .Add<Comment>(x => x.CreatedDate >= DateTime.Now.AddDays(-5));
    
    query1.GetExecutableCriteria(session).List<T>();
    

    您可能还希望急切地加载集合,并将您的限制设置为适用于您希望避免将整个数据库拉回来的内容,以及在延迟加载的列表上迭代的n+1查询条件。

    使用nhibernate解决任何类型的复杂查询的第一步是从原始sql开始,因此我们确实需要从

    Select P.*
    From Post P
    Where P.PostID Exists (
        Select P1.PostID
        From Posts P1 Inner Join Comments C ON ( P1.PostID = C.PostID )
        Where P1.PostID Exists (
            Select Top 5 C1.PostID, Count(*) as PostCount 
            From Comments C1
            Group By C1.PostID
            Order By PostCount DESC
        )
        And C.CreateDate > Now - 5 days
    )
    

    这是手工编写的,因此这更接近于查询,应该能够为您指出能够解决查询的方向。有了这方面的一些反馈,我可以添加更多关于翻译成NH。最后一个外部存在可能会在最终的nh版本中被删除,因为我相信带有注释的post矩阵就是nh将如何急切地加载实体。