Подтвердить что ты не робот

NHibernate QueryOver: получить количество строк с группой в подзапросе

Я пытаюсь получить счетчик из запроса с группой и просто не могу понять, как перевести SQL, который я хочу в синтаксис NHibernate QueryOver.

Это SQL:

select count(*) from
       (select Email from Entry
       where (conditions...)
       group by Email) as tmp

Кажется, что это просто?

Вот как я пытаюсь это сделать, но вызов RowCount(), кажется, полностью оптимизирует группу:

    var query = _unitOfWork.CurrentSession.QueryOver<ContestEntry>()
        .Select(Projections.Property<ContestEntry>(x => x.Email),
                Projections.Group<ContestEntry>(x => x.Email));

    return query.RowCount();

Я бы не прочь использовать Criteria для этого, но я очень рад новому (мне) QueryOver API, который позволяет мне уйти от магических строк.

Update:

Я не могу использовать сгенерированный SQL, который выполняет отдельный запрос в пределах count (например, select count (отдельный Email)), поскольку это приложение работает в SQL CE.

Смотрите: http://social.msdn.microsoft.com/Forums/en-US/sqlce/thread/80a1d7dd-22be-4583-b8f2-fcd8cde5ec53/ и http://our.umbraco.org/wiki/install-and-setup/sql-server-ce-4-known-issues ( "Различие в подсчете не поддерживается", примерно на 2/3 пути вниз по странице)

4b9b3361

Ответ 1

Я не уверен, зачем нужен такой сложный запрос. Если вы хотите, чтобы количество отдельных писем отвечало определенным критериям, я думаю, вы могли бы использовать что-то вроде этого в SQL:

select count(distinct email)
from Entry
where (conditions...)

И перевод этого API-интерфейса NHibernate QueryOver будет выглядеть примерно так:

int count = session.QueryOver<ContestEntry>()
            .Select(Projections.CountDistinct<ContestEntry>(x => x.Email))
            .FutureValue<int>()
            .Value;//query is not executed until here

Если мне что-то не хватает, я думаю, что это даст результат, который вам нужен. Существует также "Отличная" проекция и метод .ToRowCountQuery(), который может оказаться интересным.