【问题标题】:nHibernate QueryOver Having clause with OR conditionnHibernate QueryOver 具有 OR 条件的子句
【发布时间】:2014-06-16 10:22:20
【问题描述】:

如何在 nHibernate 中使用 queryover 实现以下查询

查询

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

【问题讨论】:

标签: nhibernate queryover


【解决方案1】:

可能是这样的

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

【讨论】:

  • 假设如果我们有一个场景,比如有子句包含'and','or'条件如何处理
  • 不确定这些是否可能......但总的来说,我的回答会给你一些提示如何共同做到这一点......玩,尝试尝试Restrictions.Or...... Restrictions.Disjunction()... 但是 HAVING 子句确实需要一些特殊处理,并不是所有的都会被接受。但是您的要求,已回答的 sn-p 将解决;)
  • 我也有类似的问题。在 where 和 have 子句中需要条件,但它都出现在 where 导致 sql 错误。尝试了此解决方案,但 queryover 将其挂起。像这样使用 .Where(WhereConjunction) .Where(HavingConjunction) 分开。不工作。
  • @qazifarhan 我建议,提出更多细节的问题,你会得到答案。如果我知道,我会尽力帮助......
  • OK 将在几分钟后发布问题。我的查询非常庞大且复杂,因此无法放置所有内容。但会在几分钟内尝试。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多