2011-11-15 55 views
2

我有4 assoiciated类,需要做一个查询。NHibernate查询与连接和组由

的类别是:

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但没有得到它的工作。有人可以帮我吗?

在此先感谢托比

+0

这将导致一个5×加盟。这可能会非常缓慢。 – Firo

+0

性能没有关系,除非它不需要10分钟* g * – Tobias

回答

2

你可以测试:

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

非常感谢。 仅有2问题: - 回报是没有的IList - 小时必须是和;-) – Tobias

+0

求和投影子查询不起作用 – Tobias

+0

更新:得到这个部分的工作。最后一个问题:Projections.Subquery不是数据类型int,但现在它是可编译的投影 – Tobias