代码之家  ›  专栏  ›  技术社区  ›  Brian Berns

如何使用具有内部select case的nhibernate重新创建SQL语句?

  •  1
  • Brian Berns  · 技术社区  · 14 年前

    我正在尝试使用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();
    

    但是,我不知道如何将这些结果通过行数分组。

    1 回复  |  直到 14 年前
        1
  •  2
  •   Diego Mijelshon    14 年前

    这应该有效…

    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();