Как я могу воссоздать оператор SQL с помощью NHibernate, который имеет внутренний выбор?

Я пытаюсь воссоздать что-то вроде следующего SQL, используя критерии NHibernate:

select Range, count(*) from (
   select
      case
         when ent.ID between 'A' and 'N' then 'A-M'
         else 'Other'
      end as Range
   from Subject
) tbl
group by tbl.Range

Я могу создать внутренний выбор следующим образом:

session.CreateCriteria<Subject>()
   .SetProjection(
      Projections.Conditional(
         Expression.Between("Name", "A", "N"),
         Projections.Constant("A-M"),
         Projections.Constant("Other")))
   .List();

Однако я не могу понять, как передать эти результаты в группировку по количеству строк.


person brianberns    schedule 18.05.2010    source источник
comment
Вы имеете в виду between 'A' and 'M' then 'A-M'?... потому что я думал, что between включает.   -  person dotjoe    schedule 19.05.2010


Ответы (1)


Это должно сработать...

session.CreateCriteria<Subject>()
   .SetProjection(
       Projections.ProjectionList()
          .Add(
             Projections.GroupProperty(
                Projections.Conditional(
                   Restrictions.Between("Name", "A", "N"),
                   Projections.Constant("A-M"),
                   Projections.Constant("Other"))))
        .Add(Projections.RowCount()))
   .List();

... но это не так. Поэтому вы можете сделать это вместо этого:

session.CreateCriteria<Subject>()
   .SetProjection(
      Projections.ProjectionList()
         .Add(
            Projections.GroupProperty(
               Projections.SqlProjection(
                  @"case
                       when Name between 'A' and 'N' then 'A-M'
                       else 'Other' 
                    end as Range",
                  new[] { "Range" },
                  new[] { TypeFactory.GetStringType(5) })))
         .Add(Projections.RowCount()))
   .List();
person Diego Mijelshon    schedule 18.05.2010
comment
Спасибо, это работает, но я надеялся не опускаться до SQL. Есть идеи, почему ваш первый пример не работает? - person brianberns; 19.05.2010
comment
Я не уверен. Это может быть ошибка в NHibernate. Но не стесняйтесь экспериментировать с этим, возможно, я что-то упустил. - person Diego Mijelshon; 19.05.2010