带有OR条件的nHibernate QueryOver Having子句

时间:2014-06-16 10:22:21

标签: nhibernate queryover

如何使用queryover

在nHibernate中实现以下查询

查询

SELECT [DepartmentID]  ,COUNT(courseId)
FROM  [Course]
where [DepartmentID] >1
GROUP BY [DepartmentID]
hAVING COUNT(courseId) = 2 or  COUNT(courseId) = 3;

表格结构

    CREATE TABLE [dbo].[Course](
[CourseID] [int] NOT NULL,
[Title] [nvarchar](100) NOT NULL,
[Credits] [int] NOT NULL,
[DepartmentID] [int] NOT NULL,

我试过的C#代码

Collection<Course> courseList = new Collection<Course>();
using (var session = NHibernateHelper.OpenSession("ConnectionName1"))
{
   Course courseAlias = null;
   SimpleExpression e1 = Restrictions.Ge(Projections.Count(Projections.Property(() => courseAlias.CourseID)), 2);
   SimpleExpression e2 = Restrictions.Ge(Projections.Count(Projections.Property(() => courseAlias.CourseID)), 3);
   var results2 = session.QueryOver<Course>(() => courseAlias)
                  .Where(e1||e2)
                  .SelectList(list => list
            .SelectGroup(x => x.DepartmentID).WithAlias(() => courseAlias.DepartmentID)
            .SelectCount(x => x.CourseID).WithAlias(() => courseAlias.CourseID)
             ).TransformUsing(Transformers.AliasToBean<Course>()).List<Course>();
}

1 个答案:

答案 0 :(得分:0)

看起来像这样

Course courseAlias = null;
var query = session.QueryOver<Course>(() => courseAlias)
    .SelectList(l => l
    .SelectGroup(item => item.DepartmentID).WithAlias( () => courseAlias.DepartmentID)
    .SelectCount(item => item.StatusID).WithAlias(() => courseAlias.StatusID)
    )
    // WHERE Clause
    .Where(item => item.DepartmentID > 1)
    // HAVING Clause
    .Where( Restrictions.In(
        Projections.Count<Course>(item => item.StatusID)
        , new List<int> {2, 3})
    )
    .TransformUsing(Transformers.AliasToBean<Course>())

var list = query
    // take skip...
    .List<Course>();