4

結果のページを表示するために使用している条件クエリがあります。また、すべてのアイテムの合計数を取得する必要があります。結果のページング用とカウント用の 2 つのクエリを使用するのではなく (.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 は、集約関数にも GROUP BY 句にも含まれていないため、ORDER BY 句では無効です。」

これは理にかなっているので、基本的にはこのようなことをしたいと思っています。

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

このようなことをする方法はありますか?そのため、ページング用とカウント用の 2 つのクエリが重複する「リスク」を回避できます。明らかに、いずれかのクエリに対する変更は、もう一方にミラーリングする必要があり、これは私が好まないリスクです。あなたならどうしますか?

4

2 に答える 2

7

これにはまさに方法があります。残念ながら、少し使いにくいです。

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

ClearOrders() が ICriteria ではなく void を返す理由はわかりませんが、機能します!

于 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 に答える