Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用NHibernate按计数分组_Nhibernate - Fatal编程技术网

使用NHibernate按计数分组

使用NHibernate按计数分组,nhibernate,Nhibernate,鉴于下表: 资源: ID int, 名字是varchar100, 地址:varchar500, 瓦查尔市100号, 等等 资源视图: Id int, 资源ID int, userId int, 查看日期日期时间 每次查看资源时,都会向该用户的ResourceView表中添加一个条目。 以下是相应的类别: 使用NHibernate,我如何按照与以下sql检索的内容类似的计数顺序获得前5名浏览量最高的资源: 从[资源]中选择* 我在哪里 从ResourceView中选择前5名resourceId 其

鉴于下表:

资源: 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完成,则可获得额外积分。

尝试以下方法:

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();