2013-03-18 49 views
1

我有一个病人记录将会/不会有设备历史记录的情况。我需要查找所有没有设备记录的患者记录或所有设备记录中具有非空字段的患者记录。我在下面查询的方式不起作用。我没有发现任何没有设备历史的病人。有什么建议么?映射是正确的,因为我可以直接访问记录,更新等。由于我有一个由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>(); 
    } 

回答

1

我想通了......我不得不使用“IsEmpty”而不是“IsNull”。

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") 
      ));