2010-09-28 60 views
1

NHibernate是否支持使用標準的內嵌視圖? Google似乎沒有返回任何相關結果。這裏是我最好使用標準轉換的查詢。我可以使用標準API使用內嵌視圖嗎?

SELECT COUNT (incident_count) AS incident_count, 
     SUM (total_customers) AS total_customers, 
     MAX (longest_etr) AS longest_etr, 
     COUNT (DISTINCT crew_count) AS crew_count 
    FROM (SELECT l.incident_id AS incident_count, 
       i.downstream_cust_qty_total AS total_customers, 
       TO_CHAR (MAX (l.etr_datetime), 
          'MM/DD/YYYY HH24:mi:ss' 
         ) AS longest_etr, 
       ca.crew_no AS crew_count 
      FROM district d, 
       LOCATION l, 
       ZONE z, 
       incident_device ID, 
       incident i, 
       crew_action ca 
      WHERE l.dist_no = d.dist_no 
      AND d.zone_id NOT IN (1008, 1010) 
      AND ID.location_id = l.location_id 
      AND ID.incident_id = i.incident_id 
      AND l.location_id = i.location_id 
      AND ca.incident_id = i.incident_id 
      AND ca.location_id = l.location_id 
      AND ID.call_type_cd IN ('ELEC', 'PLAN') 
      AND ID.clue_cd NOT IN (248, 258, 975) 
      AND l.fac_job_status_cd IN ('A', 'D', 'F', 'G', 'P', 'U', 'W') 
      AND z.zone_id = d.zone_id 
      AND ca.crew_action_id = l.crew_action_id 
      AND l.dist_no = 24 
      AND l.primary_loc_flg = 'T' 
     GROUP BY l.incident_id, i.downstream_cust_qty_total, ca.crew_no) 

我已經在where子句中轉換了所有東西。這部分沒有問題。這轉化成類似的東西。

GetSession().CreateCriteria(typeof (Incident),() => incidentAlias) 
    // Projection 
    .SetProjection(
     Projections.ProjectionList() 
      .Add(LambdaProjection.Count<Incident>(i => incidentAlias.IncidentId).As(() => IncidentCount)) 
      .Add(LambdaProjection.Sum<Incident>(i => incidentAlias.DownstreamCustQtyTotal).As(() => TotalCustomers)) 
      .Add(LambdaProjection.Max<Location>(l => locationAlias.EtrDatetime).As(() => LongestEtr)) 
      .Add(LambdaProjection.CountDistinct<CrewAction>(ca => crewActionAlias.CrewNo).As(() => CrewCount)) 
      .Add(LambdaProjection.GroupProperty(() => incidentAlias.IncidentId)) 
      .Add(LambdaProjection.GroupProperty(() => incidentAlias.DownstreamCustQtyTotal)) 
      .Add(LambdaProjection.GroupProperty(() => crewActionAlias.CrewNo)) 
    ) 
    // Aliases 
    .CreateAlias(() => incidentAlias.Locations,() => locationAlias) 
    .CreateAlias(() => incidentAlias.IncidentDevices,() => incidentDeviceAlias) 
    .CreateAlias(() => incidentAlias.District,() => districtAlias) 
    .CreateAlias(() => districtAlias.Zone,() => zoneAlias) 
    .CreateAlias(() => locationAlias.CrewAction,() => crewActionAlias) 
    // Criterias 
    .Add(() => locationAlias.PrimaryLocFlg == "T") 
    .Add(() => locationAlias.DistNo == districtNumber) 
    .Add(() => zoneAlias.ZoneId != 1008) 
    .Add(() => zoneAlias.ZoneId != 1010) 
    .Add(SqlExpression.In(() => locationAlias.FacJobStatusCd, new[] { "A", "D", "F", "G", "P", "U", "W" })) 
    .Add(SqlExpression.In(() => incidentDeviceAlias.CallTypeCd, new [] { "ELEC", "PLAN" })) 
    .Add(() => incidentDeviceAlias.ClueCd != "248") 
    .Add(() => incidentDeviceAlias.ClueCd != "258") 
    .Add(() => incidentDeviceAlias.ClueCd != "975") 
    .SetResultTransformer(Transformers.AliasToBean<Dto>()) 
    .List<Dto>(); 

請注意,我使用的是Lambda標準擴展。或者,我想我可以創建一個額外的Dto來選擇所有沒有集合函數的列,然後使用Linq來執行不同的count/sum/max/count。

+0

該查詢沒有多大意義。它相當於內部查詢。你真的試圖運行什麼查詢? – 2010-09-28 15:01:09

+0

@Diego這是Oracle上非常受歡迎的方法 - > http://www.orafaq.com/wiki/Inline_view – rebelliard 2010-09-28 15:03:43

+0

@Rafael,在示例中還有其他過濾器。在這些情況下它是有道理的。在任何情況下,「內聯視圖」是一個Oracle術語,而不是NH(這幾天幾乎所有人都稱之爲子查詢) – 2010-09-28 15:25:34

回答

1

我剛剛用HQL試過了,它不起作用(與Criteria API相同)。這是什麼工作,但是,如下:

select 
    (select count(*) from Table1 t1), 
    (select sum(*) from Table2 t2) 
from DummyTable dt 
where rownum <= 1 

DummyTable沒有做比做有那麼NHibernate的不哭一下它的其他任何東西,rownum <= 1是有保證的NHibernate不會嘗試返回一個列表的物體。 ;-)

相關問題