2012-04-17 18 views
0

私はNHibernateの新機能です。私はCreateSQLQueryを使用してこれを書いたが、可能ならばこれをNHibernate Criteriaフォーマットに移したいと思う。私のクエリは次のようになります。複雑なNHibernate基準と左外部結合?

select parent.ID as Id, ValueA.Total as ValueACount, ValueB.Total as ValueBCount 
from ParentTable parent 
left outer join 
(
    select count(*) as Total, ID 
    from ChildTable 
    where state = 'ValueA' 
    group by ID 
) ValueA on ValueA.ID = parent.ID 
left outer join 
(
    select count(*) as Total, ID 
    from ChildTable 
    where state = 'ValueB' 
    group by ID 
) ValueB on ValueB.ID = parent.ID 

テーブル名/値を抽象的に変更しました。コードはそのまま動作しますが、これはソリューション全体で唯一のクエリです。私はそれを取り除くことができるかどうかを見たいと思います。

お手数をおかけしていただきありがとうございます。あなたが私に役立つ本当に良いウェブページへのリンクを私に与えたいなら、それも良いことです。私はあなたを少なくとも親指で上げるでしょう:)

私はやや同様の質問を見たことがあります。他のいくつかの質問/回答が私を大いに助けてくれると感じたら、私にそれを指差してください。

答えて

2

あなたは、いくつかのLINQのfu

var results = from p in session.Query<Parent>() 
       select new 
       { 
        p.Id, 
        ValueACount = (from c1 in session.Query<Child>() where c1.State == "ValueA" && c1.Parent == p select c1).Count(), 
        ValueBCount = (from c2 in session.Query<Child>() where c2.State == "ValueB" && c2.Parent == p select c2).Count(), 
       }; 

または基準

var results = session.CreateCriteria<Parent>("p") 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.Property("Id")) 
     .Add(Projections.SubQuery(DetachedCriteria.For<Child>() 
      .Add(Restrictions.Eq("State", "ValueA") && Restrictions.EqProperty("Parent", "p")) 
      .SetProjection(Projections.RowCount()))) 
     .Add(Projections.SubQuery(DetachedCriteria.For<Child>() 
      .Add(Restrictions.Eq("State", "ValueB") && Restrictions.EqProperty("Parent", "p")) 
      .SetProjection(Projections.RowCount())))) 
    .List(); 
+0

私は今第二の事をしようとしているを使用して試みることができます。結果が返ってくると思われる。何が間違っているのか分かりません。あなたのコードが間違っているか、私のクラスへの私の再翻訳かどうか。私のクラスは、フィールドごとにテーブルと一致しません。私はその後、無駄な必要なプロパティだけでいくつかのダミークラスを作った。それはうまくいかなかった。私はあなたのコードで何か気づいた。あなたは "Restrictions.EqProperty( 'Parent'、 'p'))を持っています。それらはプロパティ名ではありませんか?つまり、" Id "、" Id "? – vbullinger

+0

私はクラスのクラス私のコードは、sqlのSelect ID(子c1からCount(*)を選択します。ここで、c1.parentId == p.idとc1.state = "valueA")を擬似する必要があります。親p' – Firo

+0

私は、右手側の値が左手側と等しい場合、EqPropertyがテストしていると思いました...パラメータは、NHibernateメタデータ内でlhsとrhsと表記されています...あなたはそれらを表としてラベル付けしているようです名前とエイリアス。私が誤解していますか? – vbullinger

関連する問題