使用NHibernate按计数分组
鉴于下表: 资源: ID int, 名字是varchar100, 地址:varchar500, 瓦查尔市100号, 等等 资源视图: Id int, 资源ID int, userId int, 查看日期日期时间 每次查看资源时,都会向该用户的ResourceView表中添加一个条目。 以下是相应的类别: 使用NHibernate,我如何按照与以下sql检索的内容类似的计数顺序获得前5名浏览量最高的资源: 从[资源]中选择* 我在哪里 从ResourceView中选择前5名resourceId 其中userId=3 按资源ID分组 按计数订购*desc 如果可以使用Criteria API而不是hql完成,则可获得额外积分。尝试以下方法:使用NHibernate按计数分组,nhibernate,Nhibernate,鉴于下表: 资源: ID int, 名字是varchar100, 地址:varchar500, 瓦查尔市100号, 等等 资源视图: Id int, 资源ID int, userId int, 查看日期日期时间 每次查看资源时,都会向该用户的ResourceView表中添加一个条目。 以下是相应的类别: 使用NHibernate,我如何按照与以下sql检索的内容类似的计数顺序获得前5名浏览量最高的资源: 从[资源]中选择* 我在哪里 从ResourceView中选择前5名resourceId 其
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看起来与您的问题完全相同。因此,我相信这正是您所寻找的。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>();
DetachedCriteria是实现这一点的一种方法,我认为更优雅的另一种方法是使用LINQ
为了帮助像我一样试图在Nhibernate 3.1+中找到问题答案的人,我将在这里发布我的问题答案
我使用的是NHibernate3.2,其中提供了完整的LINQ支持
使用NHibernate.Linq
这几乎是完美的,谢谢!!获得分数,我将最终解决方案作为其他任何遇到此问题的人的新答案。
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>();
var session = Application.SessionFactory.GetCurrentSession();
var _query = from r in session.Query<Resource>()
orderby r.ResourceViews.Count
select r;
return _query.Take(maxResults).ToList();