代码之家  ›  专栏  ›  技术社区  ›  Chris Conway

使用NHibernate按计数分组

  •  4
  • Chris Conway  · 技术社区  · 14 年前

    资源:

    姓名varchar(100),
    地址varchar(500),

    资源视图:
    Id内景,
    资源ID int,
    用户名int,
    viewDate日期时间

    每次查看资源时,都会向该用户的ResourceView表中添加一个条目。

    以下是相应的类:

    public class Resource
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public IList<ResourceView> ResourceViews { get; set; } // simplified
        etc. -- class simplified for question
    }
    public class ResourceView {
        public int Id { get; set; }
        public Resource Resource { get; set; }
        public User User { get; set; }
        public DateTime ViewDate { get; set; }
    }
    

    使用NHibernate,如何按与以下sql检索的内容类似的计数顺序获取前5个查看次数最多的资源:

    从[资源]中选择*
    身份证在哪里(

    其中userId=3
    分组依据(资源ID)

    )

    3 回复  |  直到 14 年前
        1
  •  5
  •   tolism7    14 年前

    DetachedCriteria dcriteria = DetachedCriteria.For<ResourceView>("rv")
                            .Add(Restrictions.Eq("userId", 3))
                            .SetProjection(Projections.GroupProperty("rv.PostID"))
                            .AddOrder(Order.Desc(Projections.Count("rv.Id")))
                            .SetMaxResults(5);
    
    var results = NHibernateSessionManager.Session.CreateCriteria<Resource>("r")
                                .Add(Subqueries.PropertyIn("r.Id", dcriteria))
                                .List<Resource>();
    

    生成的SQL看起来与您的问题完全相同。所以我相信这就是你要找的。

        2
  •  2
  •   Chris Conway    14 年前

    tolism7有99%是这样的,这是其他有类似问题的人的最终解决方案。

    var dcriteria = DetachedCriteria.For<ResourceView>("rv")
                    .Add(Restrictions.Eq("User", user))
                    .SetProjection(Projections.GroupProperty("rv.Resource"))
                    .AddOrder(Order.Desc(Projections.Count("rv.Id")))
                    .SetMaxResults(maxResults);
    var results = Session.CreateCriteria<Resource>("r")
                    .Add(Subqueries.PropertyIn("r.Id", dcriteria))
                    .List<Resource>();
    
        3
  •  2
  •   ValidfroM    13 年前

    DetachedCriteria

    为了帮助像我一样试图通过这个帖子找到nhibernate3.1+中问题答案的人,我将在这里发布我的问题答案。

    我使用的是NHibernate3.2,其中提供了完整的LINQ支持。

    using NHibernate.Linq;

            var session = Application.SessionFactory.GetCurrentSession();
    
            var _query = from r in session.Query<Resource>()
                         orderby r.ResourceViews.Count
                         select r;
            return _query.Take(maxResults).ToList();