هل يمكنني استخدام وجهات النظر المضمنة مع معايير API؟

StackOverflow https://stackoverflow.com/questions/3813371

سؤال

هل يدعم nhibernate وجهات النظر المضمنة باستخدام Criterias؟ لا يبدو أن Google يعيد أي نتائج ذات صلة. هنا الاستعلام الذي أحتاجه لتحويل ويفضل استخدام المعايير.

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)

لدي بالفعل كل شيء تم تحويله في الفقرة. هذا الجزء لم يكن مشكلة. الذي يترجم إلى شيء مثل.

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 للقيام بالعدد/sum/max/count متميز.

هل كانت مفيدة؟

المحلول

لقد جربته للتو مع HQL ولا يعمل (سيكون هو نفسه مع معايير API). ما هو العمل ، مع ذلك ، ما يلي:

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

DummyTable لا يفعل أي شيء آخر غير التواجد هناك حتى لا يبكي nhibernate حول هذا الموضوع ، و rownum <= 1 هل هناك للتأكد من أن nhibernate لا يحاول إرجاع قائمة الكائنات. ؛-)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top