Эквивалент NHibernate IQueryOver.ToRowCountQuery () при использовании HQL IQuery - PullRequest
0 голосов
/ 12 октября 2011

Я пытаюсь реализовать подкачку в моем проекте.

При использовании синтаксиса IQueryOver в NHibernate, как показано ниже, все работает как положено.

    public PagedResult<T> ExecutePagedQuery(IQueryOver<T,T> query)
    {
        SetPaging(query);

        var results = query.Future<T>();
        var count = query.ToRowCountQuery().FutureValue<int>();

        return new PagedResult<T>()
        {
            TotalItemCount = count.Value,
            PageOfResults = results.ToList()
        };
    }

    protected virtual void SetPaging(IQueryOver<T, T> query)
    {
        var maxResults = PageSize;
        var numberToSkip = (PageNumber - 1) * PageSize;

        query.Skip(numberToSkip).Take(maxResults);
    }

Однако для некоторых запросов мы используем HQL вместо синтаксиса IQueryOver.

Мне интересно, существует ли эквивалент для "query.ToRowCountQuery (). FutureValue () ", который можно использовать при запросах при передаче IQuery-части IQueryOver для предоставления количества строк.

    public PagedResult<T> ExecutePagedQuery(IQuery query)
    {
        SetPaging(query);

        var results = query.Future<T>();
        var count = // ToRowCountQueryEquivalent?

        return new PagedResult<T>()
        {
            TotalItemCount = count,
            PageOfResults = results.ToList()
        };
    }

    protected virtual void SetPaging(IQuery query)
    {
        var maxResults = PageSize;
        var numberToSkip = (PageNumber - 1) * PageSize;

        query.SetFirstResult(numberToSkip);
        query.SetMaxResults(maxResults);
    }

Ответы [ 2 ]

0 голосов
/ 12 октября 2011

С тех пор мы преобразовали наши HQL-запросы в IQueryOver, что позволило нам воспользоваться помощником ToRowCountQuery ().

0 голосов
/ 12 октября 2011

какая-то безумная идея

string countQuery;
if (query.QueryString.StartsWith("SELECT", StringComparison.OrdinalIgnoreCase))
    countQuery = Regex.Replace(query.QueryString, "SELECT (.*) FROM", @"SELECT Count($1) FROM", RegexOptions.IgnoreCase);
else
    countQuery = "SELECT COUNT(*) " + query.QueryString;
...