0

以下给出的代码示例是要检索所有活动记录。具有限制的NHibernate CreateCriteria不能按预期工作

session.CreateCriteria<VesselMasterData>() 
         .CreateAlias("BasicInfo", "bsInfo") 
         .CreateAlias("DimentionInfo", "diInfo") 
         .Add(Restrictions.Eq("IsActive", 1)) 
         .Add(Restrictions.Eq("diInfo.IsActive", 1)) 
         .Add(Restrictions.Eq("MasterDataID", masterDataID)) 
         .Add(Restrictions.Eq("bsInfo.IsActive", 1)) 
         .List<VesselMasterData>() 

父表VesselMasterData和子表是BasicInfo和DimentionInfo。 基于查询期望值应该是BasicInfo和DimentionInfo的所有活动记录。

但在输出我从BasicInfo和DimentionInfo获取所有记录。可能是什么问题。

这是VesselMasterData表的映射。

public class VesselMasterDataMap : ClassMap<VesselMasterData> 
    { 
     public VesselMasterDataMap() 
     { 
Table("VPD_VESSEL_MASTER_DATA"); 
      Schema("APPLN1"); 
      Id(x => x.MasterDataID).Column("MASTER_DATA_ID").GeneratedBy.Sequence("VPD_VESSEL_MASTER_DATA_SEQ"); 
      Map(x => x.VesselCode).Column("VESSEL_CODE"); 
      Map(x => x.IsActive).Column("IS_ACTIVE"); 
HasMany<VesselBasicInfo>(prop => prop.BasicInfo) 
        .KeyColumns.Add("MASTER_DATA_ID").Cascade.SaveUpdate().Inverse().Not.LazyLoad(); 
      HasMany<VesselDimension>(prop => prop.DimentionInfo) 
        .KeyColumns.Add("MASTER_DATA_ID").Cascade.SaveUpdate().Inverse().Not.LazyLoad(); 
     } 
    } 

回答

0

使用Restrictions.And添加的加盟条件:

 session.CreateCriteria<VesselMasterData>() 
       .CreateAlias("BasicInfo", "bsInfo") 
       .CreateAlias("DimentionInfo", "diInfo") 
       .Add(Restrictions.And(
        Restrictions.Eq("IsActive", 1), 
        Restrictions.And(
         Restrictions.Eq("diInfo.IsActive", 1), 
         Restrictions.And(
           Restrictions.Eq("MasterDataID", masterDataID), 
           Restrictions.Eq("bsInfo.IsActive", 1) 
         ) 
        ) 
       ) 
       ).List<VesselMasterData>() 
+0

感谢您的及时回复。不幸的是,BasicInfo和DimentionInfo没有名为MasterDataID的属性,因为它们只有MasterData。这是对父表的引用。还有一件事情,因为我使用WCF引用从子实体的父实体没有实现。如果我实现,那么会出现循环冗余问题。 – Desmond

+0

@Desmond:是否有任何关系属性?另外我认为你需要使用'Restrictions.And'来添加各种条件。我更新了答案。请检查,如果有帮助。 –

+0

我尝试过,但它返回相同。我创建了一个查询并发布在下面的答案中,它工作正常。但我确实需要使用CreateCriteria来找到等价的。如果你能把它转换成它会很感激。 – Desmond

0

此工程预计的方式,但期待获得同等个createCriteria代码。

session.CreateQuery(string.Format("from VesselMasterData vm inner join fetch 
vm.AcquisitionInfo acq inner join fetch vm.BasicInfo bi inner join fetch 
vm.DimentionInfo di inner join fetch vm.SaleInfo si 
where vm.MasterDataID={0} and bi.IsActive = 1 and di.IsActive = 1 ", masterDataID)).Future<VesselMasterData>();