如何将SQL聚合查询转换为NHibernate条件查询

如何将SQL聚合查询转换为NHibernate条件查询,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我是NHibernate标准API的新手。有人可以使用NHibernate中的CriteriaAPI生成这段SQL吗 select count(*) from result where Student_id in( SELECT s.Student_id from Department as d JOIN Student s ON d.Dept_id=s.Dept_id where d.Dept_id=2 ) 以及如何继续通过NHibernate中的标准API。另外,我不

我是NHibernate标准API的新手。有人可以使用NHibernate中的CriteriaAPI生成这段SQL吗

select count(*) 
from result where Student_id 
in(
  SELECT s.Student_id 
  from Department as d
  JOIN Student s ON d.Dept_id=s.Dept_id
  where d.Dept_id=2
)
以及如何继续通过NHibernate中的标准API。另外,我不想使用HQL,所以如果没有HQL,有可能在nhibernate中生成这种sql吗


您也可以使用linq-2-nhibernate。

给定以下类结构:

public class Result{
    public virtual Student Student {get; set;}
}

public class Student{
    public virtual Department Department {get; set;}
    public virtual int Id { get; set;}
}

public virtual Department {
    public virtual int Id {get; set;}
    public virtual IList<Student> Students {get; set;}
} 
公共类结果{
公共虚拟学生学生{get;set;}
}
公立班学生{
公共虚拟部门部门{get;set;}
公共虚拟整数Id{get;set;}
}
公共虚拟部门{
公共虚拟整数Id{get;set;}
公共虚拟IList学生{get;set;}
} 
以下是使用Criteria API进行的查询:

var studentidquery = DetachedCriteria.For<Student>()
  .Add(Restrictions.Eq("Department.Id"),2)
  .SetProjection(Projections.Property("Id"));

var count = session.CreateCriteria<Result>()
   .Add(Subqueries.PropertyIn("StudentId", studentidquery))
   .UniqueResult<int>();
var studentidquery=DetachedCriteria.For()
.Add(Restrictions.Eq(“Department.Id”),2)
.SetProjection(Projections.Property(“Id”));
var count=session.CreateCriteria()
.Add(subquerys.PropertyIn(“StudentId”,studentidquery))
.UniqueResult();
使用QueryOver API,它将如下所示:

var studentidquery = QueryOver.Of<Student>()
  .Where(x=>x.Department.Id==2)
  .Select(x=>x.Id);

var count = session.QueryOver<Result>()
   .WithSubquery.WhereProperty(x => x.Id).In(studentidquery)
   .Select(Projections.Count<Result>(r=>r.Id))
   .UniqueResult<int>();
var studentidquery=QueryOver.Of()
.Where(x=>x.Department.Id==2)
.选择(x=>x.Id);
var count=session.QueryOver()
.WithSubquery.WhereProperty(x=>x.Id).In(studentidquery)
.Select(projects.Count(r=>r.Id))
.UniqueResult();

另外,我认为您不需要在SQL查询中加入Department,因为您已经在Student表中将DepartmentId作为外键。没有正当理由加入额外的表是没有意义的。

给定以下类结构:

public class Result{
    public virtual Student Student {get; set;}
}

public class Student{
    public virtual Department Department {get; set;}
    public virtual int Id { get; set;}
}

public virtual Department {
    public virtual int Id {get; set;}
    public virtual IList<Student> Students {get; set;}
} 
公共类结果{
公共虚拟学生学生{get;set;}
}
公立班学生{
公共虚拟部门部门{get;set;}
公共虚拟整数Id{get;set;}
}
公共虚拟部门{
公共虚拟整数Id{get;set;}
公共虚拟IList学生{get;set;}
} 
以下是使用Criteria API进行的查询:

var studentidquery = DetachedCriteria.For<Student>()
  .Add(Restrictions.Eq("Department.Id"),2)
  .SetProjection(Projections.Property("Id"));

var count = session.CreateCriteria<Result>()
   .Add(Subqueries.PropertyIn("StudentId", studentidquery))
   .UniqueResult<int>();
var studentidquery=DetachedCriteria.For()
.Add(Restrictions.Eq(“Department.Id”),2)
.SetProjection(Projections.Property(“Id”));
var count=session.CreateCriteria()
.Add(subquerys.PropertyIn(“StudentId”,studentidquery))
.UniqueResult();
使用QueryOver API,它将如下所示:

var studentidquery = QueryOver.Of<Student>()
  .Where(x=>x.Department.Id==2)
  .Select(x=>x.Id);

var count = session.QueryOver<Result>()
   .WithSubquery.WhereProperty(x => x.Id).In(studentidquery)
   .Select(Projections.Count<Result>(r=>r.Id))
   .UniqueResult<int>();
var studentidquery=QueryOver.Of()
.Where(x=>x.Department.Id==2)
.选择(x=>x.Id);
var count=session.QueryOver()
.WithSubquery.WhereProperty(x=>x.Id).In(studentidquery)
.Select(projects.Count(r=>r.Id))
.UniqueResult();

另外,我认为您不需要在SQL查询中加入Department,因为您已经在Student表中将DepartmentId作为外键。没有正当理由加入额外的桌子是没有意义的。

嘿,乔伊。如果你在拼写/语法/交互功能方面多下些功夫,那会有帮助的。如果一个问题容易理解,你就更有可能得到帮助。此外,如果你能先自己解决问题,并在寻求帮助之前向我们展示你迄今为止所取得的成果,我们通常会非常感激。可能会对您有所帮助。@jeroen好吧,我已经看到问题是我可以基于单个查询进行计数,但是当计数基于我上面提到的另一个子查询时,如何恰当地进行计数。。我不确定我是否进行的正确,因为我没有成功,所以我请求帮助。。。抱歉英语不好:)嗨,乔伊。如果你在拼写/语法/交互功能方面多下些功夫,那会有帮助的。如果一个问题容易理解,你就更有可能得到帮助。此外,如果你能先自己解决问题,并在寻求帮助之前向我们展示你迄今为止所取得的成果,我们通常会非常感激。可能会对您有所帮助。@jeroen好吧,我已经看到问题是我可以基于单个查询进行计数,但是当计数基于我上面提到的另一个子查询时,如何恰当地进行计数。。我不确定我是否进行的正确,因为我没有成功,所以我请求帮助。。。对不起,我的英语很差:)这正是我想要的。。我很抱歉没有给出有问题的tht,我想这样就可以了。无论如何,这里有一个问题。。。我们对数据库进行了两次访问,是吗?不可能一次生成查询吗?我能看到的是,为了完成任务,它会在数据库中点击两次:)我想知道是否可以一次完成同样的任务这些查询不会两次命中数据库。这正是我想要的。。我很抱歉没有给出有问题的tht,我想这样就可以了。无论如何,这里有一个问题。。。我们对数据库进行了两次访问,是吗?不可能一次生成查询吗?我能看到的是,为了完成任务,它会在数据库中点击两次:)我想知道是否可以一次完成同样的任务这些查询不会两次命中数据库。