2012-02-22 60 views
1

我有一個包含子項的集合父對象:NHibernate的QueryOver總結集合中的字段的值

class Parent { 
    int Id {get;set;} 
    .... 
    IList<Child> Children {get;set;} 
} 

class Child { 
    int Id {get;set;} 
    int Value {get;set;} 
    ... 
    Parent Parent {get;set;} 
} 

蒙山FluentNHibernate的映射是

ParentMap:

Id(x => x.Id, "id").GeneratedBy.Assigned(); 
... 
HasMany<Child>(x => x.Children).AsBag().KeyColumn("parentid").Inverse() 
    .Fetch.Join().Cascade.AllDeleteOrphan(); 

ChildMap:

Id(x => x.Id).GeneratedBy.Assigned(); 
.... 
Map(x => x.Value, "value"); 
References<Parent>(x => x.Parent, "parentid").NotFound.Ignore(); 

我要地圖蒙山NHibernate的SQL查詢是這樣的:

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

是否有可能把這種查詢蒙山QueryOver?

感謝

+0

看到在 '預測' 使用 '平均' 的例子部分在這裏。你可以爲'sum'做同樣的事情。 http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx – 2012-02-22 14:53:47

+0

Jhonny,謝謝你的回覆。我的問題與該例中解釋的情況不同。我想獲得「價值」屬性的總和;我想是這樣的: IList的選擇= session.QueryOver () 。選擇(Projections.ProjectionList() 。新增(Projections.Property (C => c.Id)) 。新增(Projections.Sum (c => c.Value))) .List (); 但這是不可能的,因爲我無法獲得加入兒童的價值總和 – pippo 2012-02-22 17:00:04

回答

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

感謝您的回覆:第一個解決方案就是我要找的。我已經添加了分組子句,因此解決方案是: Child childAlias = null; ()=> childAlias) 。Select(Projections.Id(),Projections.Sum(()=> childAlias.Value), var selection = session.QueryOver () .JoinAlias(p => p.Children, Projections.Group (p => p.Id)) .List () .Select(arr => new {Id =(int)arr [0],Sum =(int)arr [1]}); – pippo 2012-02-24 11:25:55

+0

我會將其添加到答案。第二個查詢應該也可以,不是嗎? – Firo 2012-02-24 11:52:40

相關問題