Удаление заказа из запроса NHibernate Criteria - PullRequest
3 голосов
/ 17 ноября 2009

У меня есть запрос критерия, который я использую для отображения страниц результатов. Мне также нужно получить общее количество всех предметов. Вместо того, чтобы иметь два запроса, один для разбивки на страницы результатов и один для подсчета (поскольку они идентичны, кроме .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 barfs с "Column" dbo.Person.ordercolumn "недопустим в предложении ORDER BY, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY."

Это имеет смысл, поэтому в основном я хочу сделать что-то вроде этого.

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

Есть ли способ сделать что-то подобное? Так что я избавлен от «риска» наличия двух повторяющихся запросов, одного для подкачки страниц и одного для подсчета. Очевидно, что любое изменение в одном запросе должно быть отражено на другом, и это риск, который мне не нравится. Что бы вы сделали?

Ответы [ 2 ]

6 голосов
/ 17 ноября 2009

Для этого есть метод. К сожалению, это немного грязно в использовании.

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

Не знаю, почему ClearOrders () возвращает void вместо ICriteria, но это работает!

3 голосов
/ 17 ноября 2009

Я бы сделал что-то вроде этого:

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