Как использовать SQL Count () в QueryOver - PullRequest
3 голосов
/ 16 сентября 2011

Я пытаюсь выполнить несколько простых SQL (используя sql server 2005), используя QueryOver в NHibernate.Запрос состоит в том, чтобы подсчитать, сколько раз серийный номер многократно используется в списке предметов, а затем выбрать серийные номера только с 1 использованием.Обратите внимание, что я не хочу отличных серийных номеров, так как я не хочу использовать серийные номера, которые используют> 1.

Запрос SQL для этого:

SELECT SERNUM, expr1
FROM (SELECT SERNUM, COUNT(SERNUM) AS expr1
      FROM ITEM
      GROUP BY SERNUM) AS derivedtbl_1
WHERE (expr1 = 1)

ЧтоДо сих пор я использовал QueryOver:

var query = session.QueryOver<Item>()
                        .Select(Projections.ProjectionList()
                        .Add(Projections.Count<Item>(x => x.Sernum))
                        .Add(Projections.GroupProperty("Sernum"))).List();

Этот код генерирует SQL (хотя он не любит помещать столбец Count () в список).Я не уверен, как получить доступ к столбцу данных, сгенерированных Count (), чтобы сказать, возвращать только там, где он есть 1. SQL, который он генерирует:

SELECT   count(this_.SERNUM) as y0_,
         this_.SERNUM        as y1_
FROM     ITEM this_
GROUP BY this_.SERNUM

Я не уверен, если яЯ подхожу к этому правильному пути, но, надеюсь, кто-то может указать мне на это.

1 Ответ

3 голосов
/ 16 сентября 2011
var serials = session.QueryOver<Item>()
    .Where(Restrictions.Eq(Projections.Count<Item>(i => i.Id), 1));
    .Select(Projections.GroupProperty<Item>(i => i.Sernum))
    .List();

должно генерировать что-то вроде

SELECT SERNUM FROM ITEM GROUP BY SERNUM HAVING COUNT(*) = 1

чтобы получить предметы, сделайте что-то вроде

var subquery = QueryOver.Of<Item>()
    .Where(Restrictions.Eq(Projections.Count<Item>(i => i.Id), 1));
    .Select(Projections.GroupProperty<Item>(i => i.Sernum));

var items = QueryOver.Of<Item>()
    .WithSubquery.Where(i => i.Sernum).In(subquery);
    .List();
...