2011-11-15 4 views
2

J'ai 4 classes assiiciated et besoin de faire une requête.NHibernate Requête avec jointures et groupe par

Les classes sont:

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{ 

} 

La requête devrait se traduire par un DTO:

public class ChartDto{ 

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

} 

Je l'ai essayé avec QueryOver mais n'a pas obtenu que cela fonctionne. Est-ce que quelqu'un peut m'aider?

Merci à l'avance Tobi

+0

cela se traduirait par un 5 x rejoindre si tout est chargée à la fois. Cela pourrait être très lent. – Firo

+0

la performance n'a pas d'importance sauf si cela ne prend pas 10 minutes * g * – Tobias

Répondre

2

peut vous tester cela:

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(); 

Edit:

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; 
    }); 
+0

Merci beaucoup. seulement 2 problèmes: - retour est pas IList - heures doivent être en somme ;-) – Tobias

+0

la Somme Projection dans le sous-requête ne fonctionne pas – Tobias

+0

Mise à jour: A obtenu cette partie de travail. Dernier problème: Projections.Subquery n'est pas datatype int mais projection – Tobias

Questions connexes