NHibernate QueryOver: получить количество строк с группой в подзапросе - PullRequest
12 голосов
/ 21 апреля 2011

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

Это 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 для этого, но я рад новому (для меня) API QueryOver, который позволяет мне избавиться от волшебных строк.

Обновление:

Я не могу использовать сгенерированный SQL, который выполняет отдельный запрос в рамках счетчика (например, выберите счетчик (отдельный адрес электронной почты)), так как это приложение работает на 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 пути вниз по странице)

1 Ответ

15 голосов
/ 22 апреля 2011

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

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

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

Если я что-то упустил, я думаю, что это даст результат, к которому вы стремитесь.Также есть интересная проекция и метод .ToRowCountQuery (), которые могут вас заинтересовать.

...