Я пытаюсь воссоздать что-то как следующий 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();
Однако я не могу выяснить, как передать те результаты по каналу в группировку количеством строки.
Это должно сработать ...
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();