从NHibernate条件查询中删除订单

从NHibernate条件查询中删除订单,nhibernate,criteria,icriteria,Nhibernate,Criteria,Icriteria,我有一个用于显示结果页面的条件查询。我还需要获得所有物品的总数。而不是有两个查询,一个用于分页结果,另一个用于计数(因为它们与.AddOrder()不同) 有没有办法做到这一点?这样我就避免了两个重复查询的“风险”,一个用于分页,一个用于计数。显然,对任一查询的任何更改都需要在另一个查询上镜像,这是我不喜欢的风险。你会怎么做?我会这样做: private ICriteria BaseQuery { get { return NHibernateSesssionManage

我有一个用于显示结果页面的条件查询。我还需要获得所有物品的总数。而不是有两个查询,一个用于分页结果,另一个用于计数(因为它们与.AddOrder()不同)


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

我会这样做:

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"));
    }
}
private ICriteria BaseQuery{
得到{
返回NHibernateSessionManager.GetSession().CreateCriteria();
}
}
公共ICriteria标准查询{
得到{
返回BaseQuery.AddOrder(“OrderProperty”,Order.Desc);
}
}
公共ICriteria CountQuery{
得到{
返回BaseQuery.SetProjection(Projections.Count(“ID”));
}
}

有一种方法正好可以解决这个问题。不幸的是,使用起来有点混乱

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

不知道为什么ClearOrders()返回的是void而不是ICriteria,但它很管用!

哇,NHibernate的家伙真的什么都想好了!!可惜我不能“返回StandardQuery.ClearOrders();”我不知道他们为什么这样做。。。
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"));
    }
}
    private ICriteria NewCount
    {
        get
        {
            ICriteria countQuery = (ICriteria) StandardQuery.Clone();
            countQuery.ClearOrders();
            return countQuery.SetProjection(Projections.Count("ID"));
        }
    }