考虑下面的类结构:
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;}
}
下面是使用您的查询的标准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>();
使用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>();
另外我不认为你需要在你的SQL查询中加入Department,因为你已经有了DepartmentId作为外国人在Student表中输入n个键。没有理由加入额外的桌子没有意义。
嘿,快乐。如果你在拼写/语法/函数上做了额外的工作,这将会有所帮助。如果一个问题容易阅读,你更有可能获得帮助。此外,如果您先尝试自己解决问题,并通过询问帮助向我们展示您到目前为止的情况,通常会感激不尽。 [NHibernate文档](http://nhforge.org/doc/nh/en/index.html#manipulatingdata-criteria)可以帮助你解决这个问题。 – Jeroen
@jeroen以及我已经看到,问题是我可以基于单个查询,但如何做到这一点特别是当计数是基于另一个子查询,我上面提到..我不知道如果即时进行正确的原因,我没有成功所以我寻求帮助...对不起英语,但对不起:) – Joy