4

我有一个标准查询,用于显示结果页面。我还需要获取所有项目的总数。而不是有两个查询,一个用于分页结果,一个用于计数(因为除了 .AddOrder() 之外它们是相同的

public ICriteria StandardQuery {
    get {
        return NHibernateSesssionManager.GetSession.CreateCriteria<Person>.AddOrder("OrderProperty", Order.Desc);
    }

public ICriteria CountQuery {
    get{
        return StandardQuery.SetProjection(Projections.Count("ID"));
    }

显然,带有“列“dbo.Person.ordercolumn”的 CountQuery barfs 在 ORDER BY 子句中是无效的,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

这是有道理的,所以基本上我想做这样的事情。

public ICriteria CountQuery {
    get{
        return StandardQuery.RemoveOrders().SetProjection(Projections.Count("ID"));
    }

有没有办法做这样的事情?这样我就避免了有两个重复查询的“风险”,一个用于分页,一个用于计数。显然,对任一查询的任何更改都需要反映在另一个查询上,这是我不喜欢的风险。你会怎么办?

4

2 回答 2

7

有一种方法可以做到这一点。不幸的是,它使用起来有点乱。

    private ICriteria NewCount
    {
        get
        {
            ICriteria countQuery = (ICriteria) StandardQuery.Clone();
            countQuery.ClearOrders();
            return countQuery.SetProjection(Projections.Count("ID"));
        }
    }

不知道为什么 ClearOrders() 返回 void 而不是 ICriteria,但它确实有效!

于 2009-11-17T20:40:52.087 回答
3

我会做这样的事情:

private ICriteria BaseQuery {
    get {
        return NHibernateSesssionManager.GetSession().CreateCriteria<Person>();
    }
}

public ICriteria StandardQuery {
    get {
        return BaseQuery.AddOrder("OrderProperty", Order.Desc);
    }
}

public ICriteria CountQuery {
    get{
        return BaseQuery.SetProjection(Projections.Count("ID"));
    }
}
于 2009-11-17T20:23:55.323 回答