如何使用具有内部select大小写的NHibernate重新创建SQL语句?

如何使用具有内部select大小写的NHibernate重新创建SQL语句?,nhibernate,group-by,criteria,projection,Nhibernate,Group By,Criteria,Projection,我正在尝试使用NHibernate标准重新创建类似以下SQL的内容: 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.Creat

我正在尝试使用NHibernate标准重新创建类似以下SQL的内容:

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()
.SetProjection(
预测.有条件的(
“名称”、“A”、“N”之间的表达式,
预测。常数(“A-M”),
预测(常数(“其他”))
.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()
.SetProjection(
投影。投影列表()
.添加(
1.GroupProperty(
预测.有条件的(
限制。在(“名称”、“A”、“N”)之间,
预测。常数(“A-M”),
预测(常数(“其他”))
.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();
session.CreateCriteria()
.SetProjection(
投影。投影列表()
.添加(
1.GroupProperty(
Projections.SqlProjection(
@“情况
当名称介于“A”和“N”之间时,则为“A-M”
“其他”
以范围结束“,
新[]{“范围”},
新[]{TypeFactory.GetStringType(5)})
.Add(Projections.RowCount())
.List();

你是说
介于'A'和'M'之间,然后是'A-M'
?。。。因为我认为
之间的
是包容的。谢谢,这确实有效,但我希望不要陷入SQL。你知道为什么你的第一个例子不起作用吗?我不确定。这可能是NHibernate中的一个bug。但请随意尝试一下,也许我错过了什么。