Group By使用NHibernate进行分组

Chr*_*way 4 nhibernate

给出以下表格:

资源:
ID int,
Name varchar(100),
Address varchar(500),
City varchar(100)
等.

ResourceViews:
Id int,
resourceId int,
userId int,
viewDate DateTime

每次查看资源时,都会向该用户的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; }
}
Run Code Online (Sandbox Code Playgroud)

使用NHibernate,如何通过类似于以下sql检索的计数顺序获得前5个查看次数最多的资源:

select [from [resource]
where ID in(
从resourceViews
中选择前5个resourceId,其中userId = 3
group by(resourceId)
order by count(*)desc
)

如果可以使用Criteria API而不是hql来完成加分.

tol*_*sm7 5

试试这个:

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>();
Run Code Online (Sandbox Code Playgroud)

生成的SQL看起来与您的问题完全相同.因此,我相信这正是你要找的.