Search code examples
c#-4.0nhibernatefluent-nhibernatequeryover

NHibernate group by parentId in child and get the value from parent table for this parentId


I have one to many between Header and Detail as shown in the below class

public class Header
{
    public virtual string ScriptNumber { get; set; }
    public virtual IList<Detail> Details { get; set; }
    public virtual string StartTime { get; set; }
}

public class Detail
{
    public virtual string ScriptNumber { get; set; }
    public virtual DateTime UpdatedDate { get; set; }
    public virtual Header ProgramHeader { get; set; }   
}

I am trying to query the Detail to group by ScriptNumber and get the corresponding StartTime from the Header table. Can anyone help me how to do this. Currently my NHibernate query is:

var changesInDetail = _session.QueryOver<Detail>()
                        .Where(x => x.UpdatedDate.IsBetween(changedFrom).And(changedTo))
                        .SelectList(list => list.SelectGroup(pr => pr.ScriptNumber))
                        .Future<string>();

How to get the StartTime from Header for the grouped by value in Detail?

The following works as I expected. Can anyone please confirm if this is the best approach?

        var changedScriptsInDetail1 = _session.QueryOver<Detail>(() => detailAlias)
                .JoinQueryOver(d => d.ProgramHeader, () => headerAlias)
                .Where(() => detailAlias.UpdatedDate.IsBetween(changedFrom).And(changedTo))
                .SelectList(list => list
                    .SelectGroup(pr => pr.ScriptNumber)
                    .SelectGroup(()=>headerAlias.StartTime)
                 )
                 .List<object[]>();

Solution

  •     var changedScriptsInDetail1 = _session.QueryOver<Detail>(() => detailAlias)
                .JoinQueryOver(d => d.ProgramHeader, () => headerAlias)
                .Where(() => detailAlias.UpdatedDate.IsBetween(changedFrom).And(changedTo))
                .SelectList(list => list
                    .SelectGroup(pr => pr.ScriptNumber)
                    .SelectGroup(()=>headerAlias.StartTime)
                 )
                 .List<object[]>();