我的情况是患者记录将/不会有设备历史记录。我需要找到所有没有设备记录的患者记录,或者所有患有设备记录且具有非空的字段的患者。我在下面查询的方式不起作用。我找不到任何没有设备历史的病人。有什么建议?映射是正确的,因为我可以直接访问记录,更新等。由于我有一个包含超过40,000条记录的数据库,我无法撤回所有患者并进行子计数。它会很慢并且使用太多内存。
非常感谢任何帮助。提前谢谢。
public IList<Patients> GetAllPatientsWithoutDevice(int facilityID, string search)
{
ICriteria query = FluentSessionManager.GetSession()
.CreateCriteria<Patients>()
.Add(Expression.Eq("IsDeleted", false))
.CreateAlias("Facilities", "f")
.Add(Expression.Eq("f.ID", facilityID))
.CreateAlias("EquipmentHistory", "eh") // Tried, inner, left and right joins...
.Add(Expression.Or(
Expression.IsNull("EquipmentHistory"),
Expression.IsNotNull("eh.DateOffPatient")
));
query.AddOrder(new Order("FirstName", true))
.AddOrder(new Order("LastName", true));
return query.List<Patients>();
}
答案 0 :(得分:1)
我想通了......我不得不使用&#34; IsEmpty&#34;而不是&#34; IsNull&#34;。
ICriteria query = FluentSessionManager.GetSession()
.CreateCriteria<Patients>()
.Add(Expression.Eq("IsDeleted", false))
.CreateAlias("Facilities", "f")
.Add(Expression.Eq("f.ID", facilityID))
.CreateAlias("EquipmentHistory", "eh", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.Add(Expression.Or(
Expression.IsEmpty("EquipmentHistory"),
Expression.IsNotNull("eh.DateOffPatient")
));