2010-06-22 84 views
3

我需要在表上執行復雜的左連接,並且不確定如何使用條件查詢編寫代碼。目前我有:nHibernate複雜連接

public IList<RezolutionConfig> GetSearchConfigByManagerCategoryProduct(int ManagerId, int ProductTypeId, int ConfigCategoryId) 
    { 
     ICriteria criteria = Session.GetISession().CreateCriteria(typeof(RezolutionConfig)) 
      .CreateAlias("RezolutionConfigCategory", "rcc") 
      .Add(Expression.Eq("rcc.id", ConfigCategoryId)) 
      .CreateAlias("RezolutionProductType","rpt") 
      .Add(Expression.Eq("rpt.id", ProductTypeId)) 
      .CreateAlias("RezolutionManagerConfigs", "rmc", NHibernate.SqlCommand.JoinType.LeftOuterJoin) 
      .CreateAlias("rmc.Manager", "m", NHibernate.SqlCommand.JoinType.LeftOuterJoin) 
      .Add(Expression.Eq("m.id", ManagerId)); 

     return criteria.List<RezolutionConfig>(); 
    } 

其產生:。

SELECT * FROM [DBO] [RezolutionConfig]在此THIS_ 內加入[DBO] [RezolutionConfigCategory] ​​rcc1_ _ [RezolutionConfigCategoryId] = rcc1_。 [RezolutionConfigCategoryId] 內有關此加入[DBO]。[RezolutionProductType] rpt2_ _ [RezolutionProductTypeId] = RPT2 _ [RezolutionProductTypeId]在此 左外連接[DBO]。[RezolutionManagerConfig] rmc3_ _ [RezolutionConfigID] = RMC3 _ [RezolutionConfigID] left outer join [dbo]。[Manager] m4_ on rmc3 _。[ManagerID] = m4 _。[ManagerID] WH ERE RCC1 _ [RezolutionConfigCategoryId] = 1 和RPT2 _ [RezolutionProductTypeId] = 1 和M4 _ [經理ID = 9135

我需要產生是

SELECT * FROM [DBO]。[RezolutionConfig ] THIS_ 內有關此在此加入[DBO]。[RezolutionConfigCategory] ​​rcc1_ _ [RezolutionConfigCategoryId] = RCC1 _ [RezolutionConfigCategoryId] 內加入[DBO]。[RezolutionProductType] rpt2_ _ [RezolutionProductTypeId] = RPT2 _ [RezolutionProductTypeId] 左外部連接[dbo]。[RezolutionManagerConfig] rmc3_ on this _。[RezolutionConfigID] = rmc3 _。[RezolutionConfigID] lef [RemaolutionConfigCategoryId] = 1 和rpt2 _ [RezolutionProductTypeId] = 1

[管理員]
+1

在這種情況下,用HQL編寫查詢並不容易嗎? – 2010-06-22 19:36:40

回答

0

NHibernate不支持爲連接添加約束,如您所願:left outer join [dbo].[Manager] m4_ on rmc3_.[ManagerID]=m4_.[ManagerID] and m4_.[ManagerID] = 9135。我認爲你最好的方法是在HQL中編寫查詢,並使用子查詢來約束管理器。