2012-02-22 25 views
1

は、私が子供のコレクションを含む親オブジェクトを持つコレクション内のフィールドの値を合計しますチャイルドマップ:NHibernateのQueryOverは

Id(x => x.Id).GeneratedBy.Assigned(); 
.... 
Map(x => x.Value, "value"); 
References<Parent>(x => x.Parent, "parentid").NotFound.Ignore(); 
QueryOver whithこのクエリを変換する

select p.id, sum(c.value) 
from parent p, child c 
where p.id = c.parentid 

ことが可能です:

私はNHibernateのwhithこのようなSQLクエリをマッピングする必要がありますか?

おかげ

+0

は '予測' の下に '平均' の使用例を参照してみてくださいセクションを参照してください。あなたは 'sum'のために同じことをすることができます。 http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx –

+0

Jhonny、返信いただきありがとうございます。私の問題は、その例で説明したケースとは異なります。私は "値"プロパティの合計を取得したい。 のIList選択= session.QueryOver () .Select(Projections.ProjectionList() .Add(Projections.Property (C => c.Id)) .Add(Projections.Sum:私はこのようなものだろう(c => c.Value))) .List (); これはできません。参加した子どもたちの価値の合計を得ることができないからです。 – pippo

答えて

0

あなたはこの

Child childAlias = null; 
var selection = session.QueryOver<Parent>() 
    .JoinAlias(p => p.Childs,() => childAlias) 
    .Select(Projections.Group(Projections.Id()), Projections.Sum(() => childAlias.Value)) 
    .List<object[]>() 
    .Select(arr => new { Id = (int)arr[0], Sum = (int)arr[1] }); 

またはこの

Child parentAlias = null; 
var selection = session.QueryOver(() => parentAlias) 
    .Select(Projections.Id(), Projections.SubQuery(QueryOver.Of<Child>() 
     .Where(c => c.Parent == parentAlias) 
     .Select(Projections.Sum<Child>(c => c.Value)) 
    .List<object[]>() 
    .Select(arr => new { Id = (int)arr[0], Sum = (int)arr[1] }); 

またはこの

IList selection = from p in session.Query<Parent> 
        select new { p.Id, Sum = p.Childs.Sum(c => c.Value) }; 
+0

あなたの返事に感謝します。最初の解決策は私が探しているものです。グループ化節を追加したので、解決策は次のとおりです。 子のchildAlias = null; var selection = session.QueryOver .JoinAlias(p => p.Children、()=> childAlias) .Select(Projections.Id()、Projections.Sum(()=> childAlias.Value)、 (arr [0]、Sum =(int)arr [1]});を選択します。 – pippo

+0

私はそれを答えに加えます。 2番目のクエリもうまくいくはずです。 – Firo

関連する問題