从NHibernate Criteria查询中移除订单

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"));
    }

显然,CountQuery出现了错误,提示"Column "dbo.Person.ordercolumn" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause."

这是有道理的,所以我想做类似于这样的事情。

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

有没有办法做到这样?这样我就可以避免出现两个重复的查询,一个用于分页,一个用于计数。显然,对任何一个查询的更改都需要在另一个查询上进行镜像操作,这是我不喜欢的风险。你会怎么做呢?

2个回答

7

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

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

不知道为什么ClearOrders()返回void而不是ICriteria,但它可以工作!

哇,NHibernate的开发人员真的想到了一切!可惜我不能执行“return StandardQuery.ClearOrders();”。我不知道他们为什么这样做... - reach4thelasers

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"));
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接