2011-11-15 87 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