Search code examples
nhibernatequeryover

nHibernate QueryOver Having clause with OR condition


How to achieve the below query in nHibernate using queryover

Query

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

Table structure

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

C# code i tried

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

Solution

  • It could look like this

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