如何获取根记录的唯一计数,而不是子记录?

时间:2012-12-18 18:47:04

标签: fluent-nhibernate

我正在尝试总计有多少患者与他们相关的设备处于非活动状态。以下返回值4.它需要返回值1,因为有1个患者对4件设备无效。

return FluentSessionManager.GetSession()
            .CreateCriteria<Patients>()
            .CreateAlias("Locations", "l")
            .CreateAlias("l.Branches", "b")
            .CreateAlias("PatientsEquipment", "pe")
            .Add(Expression.Eq("b.ID", branchID))
            .Add(Expression.Eq("CurrentStatus", Enumerations.PatientStatus.Inactive))
            .Add(Expression.IsNull("pe.PickupDate"))
            .Add(Expression.Eq("pe.PickupRequestSent", false))
            .Add(Expression.Eq("pe.MaintenanceRequestSent", false))
            .SetResultTransformer(new DistinctRootEntityResultTransformer())
            .SetProjection(Projections.Count("ID")).UniqueResult<int>();

如果我执行以下操作,我可以获得准确的计数:

            ICriteria query = FluentSessionManager.GetSession()
            .CreateCriteria<Patients>()
            .CreateAlias("Locations", "l")
            .CreateAlias("l.Branches", "b")
            .CreateAlias("PatientsEquipment", "pe")
            .Add(Expression.Eq("b.ID", branchID))
            .Add(Expression.Eq("CurrentStatus", Enumerations.PatientStatus.Inactive))
            .Add(Expression.IsNull("pe.PickupDate"))
            .Add(Expression.Eq("pe.PickupRequestSent", false))
            .Add(Expression.Eq("pe.MaintenanceRequestSent", false))
            .SetResultTransformer(Transformers.DistinctRootEntity);

        IList<Patients> patients = query.List<Patients>();

        if (patients == null)
        {
            return 0;
        }

        return patients.Count();

任何想法如何在不返回完整记录集然后计算它的情况下获得准确的患者计数?

提前致谢。

2 个答案:

答案 0 :(得分:0)

您可以添加GroupProperty投影吗?与Projections.GroupProperty(Projections.Property<Patients>(x => x.Id))

一样

答案 1 :(得分:0)

我找到了答案......

 return FluentSessionManager.GetSession()
        .CreateCriteria<Patients>()
        .CreateAlias("Locations", "l")
        .CreateAlias("l.Branches", "b")
        .CreateAlias("PatientsEquipment", "pe")
        .Add(Expression.Eq("b.ID", branchID))
        .Add(Expression.Eq("CurrentStatus", Enumerations.PatientStatus.Inactive))
        .Add(Expression.IsNull("pe.PickupDate"))
        .Add(Expression.Eq("pe.PickupRequestSent", false))
        .Add(Expression.Eq("pe.MaintenanceRequestSent", false))
        .SetProjection(Projections.CountDistinct("ID")).UniqueResult<int>();

显然,当我使用Projections.Count时,它会计算所有记录,包括重复记录。当我把它改成CountDistinct解决了我的问题。