NHibernate QueryOver Несколько заказов по псевдонимам - PullRequest
3 голосов
/ 03 ноября 2011

Это мой сценарий:

 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.

Я использую псевдонимы для создания запроса с несколькими объединениями и несколькими заказами.

Ответы [ 2 ]

7 голосов
/ 09 октября 2012

Ваш исходный код должен работать без использования SQL, если вы измените свои OrderByAlias и ThenByAlias на обычные предложения OrderBy и ThenBy.У меня была такая же проблема, и она решила ее для меня.

1 голос
/ 11 ноября 2011

Я решил это с помощью 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;
}

Надеюсь, это кому-нибудь пригодится.

...