2011-07-12 18 views
0

NHibernateのCriteria APIを初めて使用しました。誰かがNHibernateのCriteria APIを使用してこのSQLを生成できますか?SQL集計クエリをNHibernateの条件クエリに変換する方法

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のCriteria APIをどのように進めるか。 P。私はHQLを使用したくないので、HQLなしでnhibernateでこの種のsqlを生成することは可能ですか?

linq-2-nhibernateも使用できます。

+2

ちょっと喜び。あなたがスペル/文法/相互作用に余分な努力を払うと助けになるでしょう。質問が読みやすい場合は、助けを受ける可能性が高くなります。また、あなたが最初に自分自身でそれを解決しようとすると、あなたは今までに何を手に入れて助けを求めているのかを見せていただければ大いに感謝しています。 [NHibernateのドキュメント](http://nhforge.org/doc/nh/en/index.html#manipulatingdata-criteria)がこれを手伝ってくれるかもしれません。 – Jeroen

+0

@jeroenまあ私はすでに問題が私は単一のクエリに基づいて数えることができることを見てきたが、カウントが別のサブクエリに基づいているときperticularlyを行う方法..私は上記の私はdidnt成功だから私は助けを求めた...しかし、悪い英語のために申し訳ありません:) – Joy

答えて

3

次のクラス構造を考える:ここ

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

をまた、私はDepartmentIdを既に持っているので、SQLクエリでDepartmentへの参加が必要ではないと思いますStudentテーブルのnキーを押します。正当な理由で余分なテーブルに参加する意味がない。

+0

正確に私が望んでいた..私はそれらのマッピングが質問にthtを与えていないために申し訳ありませんでした。とにかくここで1つの質問...私たちは2回データベースにヒット?一度にクエリを生成することはできませんか?私が見ることができるのは、データベースを2回ヒットして仕事を終わらせることです。 :) – Joy

+1

これらのクエリはDBに2回ヒットしません。 –

関連する問題