2012-08-07 57 views
4

我的下一個聚集查詢:QueryOver找到別名串

IQueryOver<CustomerTask, CustomerTask> query = GetSession().QueryOver(() => task) 
    .JoinAlias(() => task.TaskList,() => taskList) 
    .JoinAlias(() => task.TaskChain,() => taskChain) 
    .Where(() => taskList.SalesFlow == salesFlow) 
    .Select(
     Projections.Group(() => taskList.Id) 
      .WithAlias(() => salesFlowTaskStatisticsGridRow.RowId), 
     Projections.Group(() => taskList.SalesFlow.Id) 
      .WithAlias(() => salesFlowTaskStatisticsGridRow.SalesFlowId), 
     Projections.Group(() => taskList.Name).WithAlias(() => salesFlowTaskStatisticsGridRow.Name), 
     // ReSharper disable ExpressionIsAlwaysNull 
     criteriaBuilder.FindAverageCompletionTime(salesFlowTaskStatisticsGridRow) 
    // ReSharper restore ExpressionIsAlwaysNull 
    ).TransformUsing(Transformers.AliasToBean<SalesFlowTaskStatisticsGridRow>()); 

由於計算的平均時間需要調用DATEDIFF函數寫它,我用SqlProjection

private static AggregateProjection CountAverageCompletionTimeForTasksCriteria() 
    { 
     return Projections.Avg(Projections 
      .SqlProjection("datediff(ss, Created, CompletedDate) as CompletionTimeInSeconds", 
       new[] {"CompletionTimeInSeconds"}, new[] {NHibernateUtil.Double})); 
    } 

的問題是,無論是任務 and TaskChain創建的完成日期屬性,所以我需要傳遞一個別名。但我無法設法得到字符串別名來形成正確的sql投影。有沒有辦法得到這些別名,或者我可以堅持在功能到查詢以其他方式嗎?

回答

0

在使用SqlProjection時,NHibernate沒有提供很多用於處理別名的複雜選項。

唯一的解決方法是首先配置文件中的查詢沒有DATEDIFF投影,看看NHibernate的別名使用的任務和TaskChain(他們很可能會像THIS_和* this_1 *)。然後,您可以手動硬編碼這些別名到這樣的投影:

.SqlProjection("datediff(ss, this_.Created, this_.CompletedDate) as CompletionTimeInSeconds", 
       new[] {"CompletionTimeInSeconds"}, new[] {NHibernateUtil.Double}) 

顯然,這是遠遠不夠完善,但它會奏效。