1

我正在尝试统计有多少患者不使用与他们相关的设备。以下返回值 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();

有什么想法可以在不返回完整记录集然后对其进行计数的情况下获得准确的患者计数吗?

提前致谢。

4

2 回答 2

0

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

于 2012-12-19T15:39:31.990 回答
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 时,它解决了我的问题。

于 2013-03-11T19:06:26.403 回答