2011-11-03 35 views
3

这是我的情景:NHibernate的QueryOver多个订单通过与别名

public IEnumerable<ISuperMerc> getSuperMercTree(string IDLanguage) 
{ 

     SuperMercModel SMer = null; 
     SuperMercDescriptionModel descrSMer = null; 
     MercModel Merc = null; 
     MercDescriptionModel descrMerc = null; 

     var qOver = _HibSession.QueryOver<SuperMercModel>(() => SMer)      
       .JoinAlias(() => SMer.DescriptionsSM,() => descrSMer,JoinType.LeftOuterJoin) 
        .Where(() => descrSMer.IDLanguage == IDLanguage) 
       .JoinAlias(() => SMer.Merc,() => Merc,JoinType.LeftOuterJoin) 
        .JoinAlias(() => Merc.DescriptionsMer,() => descrMerc,JoinType.LeftOuterJoin) 
         .Where(() => descrMerc.IDLanguage == IDLanguage)  
       .OrderByAlias(() => SMer.ID).Asc 
       .ThenByAlias(() => descrMerc.Description).Asc 
       .Future<SuperMercModel>(); 

     return qOver; 

} 

我遇到了以下错误

无法解析属性:说明:SuperMercModel

奇怪的是,Description字段位于MercDescriptionModel类中,不在SuperMercModel类中。

我正在使用别名来创建多联接和多订单查询。

回答

1

我使用HQL 下面的代码

public IEnumerable<ISuperMerc> getSuperMercTree(string IDLanguage) 
{ 
    string hql = string.Empty; 

    hql = "select SM from SuperMercModel SM" 
       + " left join fetch SM.DescriptionsSM DSM" 
       + " left join fetch SM.Merc ME" 
       + " left join fetch ME.DescriptionsMer DME" 
       + " where DSM.IDLanguage = :IDLanguage " 
       + " and DME.IDLanguage = :IDLanguage " 
       + " order by SM.ID asc, DME.Description asc"; 

      IQuery query = _HibSession 
       .CreateQuery(hql) 
       .SetString("IDLanguage ", IDLanguage); 

      IList<SuperMercModel> result = query.List<SuperMercModel>(); 


      return result; 
} 

我希望这是对别人有帮助的解决了这个问题。

+1

为什么要使用旧的方法? QueryOver没有任何解决方案吗? – whitestream

7

如果您将OrderByAliasThenByAlias更改为常规OrderByThenBy子句,则您的原始代码应该不使用SQL。我有同样的问题,并为我解决它。

+0

是的,OrderBy应该使用NOT OrderByAlias –

+0

这个。为什么地狱是方法的名称“OrderByAlias”,如果它不按别名排序呢? – Th3B0Y