NHibernate QueryOver сумма значений поля в коллекции - PullRequest
1 голос
/ 22 февраля 2012

У меня есть родительский объект, содержащий коллекцию детей:

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?

Спасибо

1 Ответ

0 голосов
/ 23 февраля 2012

вы можете попробовать это

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) };
...