Запрос NHibernate с объединениями и группировкой - PullRequest
2 голосов
/ 15 ноября 2011

У меня 4 ассоциированных класса, и мне нужно сделать запрос.

Классы:

 public class Project{

     IList<Process> Processes{get;set;}

 }


 public class Process{

     IList<Association> Associations{get;set;}

 }


 public class Association{

     public IList<MonthCapacity> MonthCapacities{get;set;}
     public FieldOfActivity FieldOfActivity{get;set;}

 }

 public class MonthCapacity{

     public int Hours{get;set;}
     public DateTime MonthDate{get;set;}

 }

 public class FieldOfActivity{

 }

Запрос должен привести к DTO:

 public class ChartDto{

      public Project Project{get;set;}
      public FieldOfActivity FieldOfActivity{get;set;}
      public int Hours{get;set;}

 }

Я попробовал это с QueryOver, но так и не заработал. Может ли кто-нибудь помочь мне?

Заранее спасибо Тоби

1 Ответ

2 голосов
/ 15 ноября 2011

Вы можете проверить это:

Process processAlias = null;
Association assocAlias = null;
FieldOfActivity actAlias = null;

var subquery = QueryOver.Of<MonthCapacity>()
    .Where(m => m.Association == assocAlias)
    .Select(Projections.Sum<MonthCapacity>(m => m.Hours));

var results = session.QueryOver<Project>()
    .JoinQueryOver(p => p.Processes, () => processAlias)
    .JoinQueryOver(p => p.Associations, () => assocAlias)
    .JoinAlias(p => p.FieldOfActivity, () => actAlias)
    .Select(p => new ChartDto { Project = p, FieldOfActivity = actAlias, Hours = Projections.Subquery(subquery) })
    .List();

Редактировать:

var results = session.QueryOver<Project>()
    .JoinQueryOver(p => p.Processes, () => processAlias)
    .JoinQueryOver(p => p.Associations, () => assocAlias)
    .JoinAlias(p => p.FieldOfActivity, () => actAlias)
    .SelectList(list => list
        .Select(p => new ChartDto { Project = p, FieldOfActivity = actAlias, Hours = 0 })
        .Select(Projections.Subquery(subquery))
    )
    .List<object[]>()
    .Select(objects =>
    {
        var chart = (ChartDto)objects[0];
        chart.Hours = (int)objects[1];
        return chart;
    });
...