У меня есть несколько запросов к одной таблице. Поскольку не все столбцы / свойства необходимы, я указываю столбцы с помощью списка выбора. В качестве примера возьмем следующий метод. Этот метод работает

public IEnumerable<ResultDto> GetEntityAsDto(eStatusBinderProduktion fromState, eStatusBinderProduktion toState)
{
    EntityClass entityAlias = null;
    ResultDto resultAlias = null;

    var query = Session.QueryOver<EntityClass>(() => entityAlias)
      .Where(() => entityAlias.ProduktionStatus >= (byte)fromState)
      .And(() => entityAlias.ProduktionStatus <= (byte)toState);

    query.SelectList(list => list
         .Select(() => entityAlias.PrimaryID).WithAlias(() => resultAlias.PrimaryID)
         .Select(() => entityAlias.SecondaryID).WithAlias(() => resultAlias.SecondaryID)
         );

    return query.TransformUsing(Transformers.AliasToBean<ResultDto>())
          .List<ResultDto>();
}

Поскольку мне нужно определить SelectList несколькими методами, я попытался переместить SelectList в отдельный метод.

Следующий код не работает, NHibernate выдает исключение

NHibernate.QueryException: 'не удалось разрешить свойство: entity.PrimaryID of: MyProjectNamespace.DAL.Interfaces.Entities.EntityClass' "

public IEnumerable<ResultDto> GetEntityAsDto(eStatusBinderProduktion fromState, eStatusBinderProduktion toState)
{
    EntityClass entityAlias = null;
    ResultDto resultAlias = null;

    var query = Session.QueryOver<EntityClass>(() => entityAlias)
      .Where(() => entityAlias.ProduktionStatus >= (byte)fromState)
      .And(() => entityAlias.ProduktionStatus <= (byte)toState);

    MapPropertiesOfEntityToResult(entityAlias, resultAlias, query);

    return query.TransformUsing(Transformers.AliasToBean<ResultDto>())
          .List<ResultDto>();
}

private void MapPropertiesOfEntityToResult(EntityClass entity, ResultDto resultAlias, IQueryOver<EntityClass, EntityClass> query)
{
  query.SelectList(list => list
   .Select(() => entity.PrimaryID).WithAlias(() => resultAlias.PrimaryID)
   .Select(() => entity.SecondaryID).WithAlias(() => resultAlias.SecondaryID)
    );
}

Дополнительная информация:
- Сопоставления верны
- таблица заполнена тестовыми данными

1
AFrueh 17 Окт 2019 в 16:10

1 ответ

Лучший ответ

Псевдоним для заполнения SelectList нам не нужен. Мы можем извлечь выгоду из параметров типа, поставляемых с IQueryOver<TRoot,TSubType>:

//private void MapPropertiesOfEntityToResult(EntityClass entity
//   , ResultDto resultAlias, IQueryOver<EntityClass, EntityClass> query)
private void MapPropertiesOfEntityToResult( // no need for entity
      ResultDto resultAlias, IQueryOver<EntityClass, EntityClass> query)
{
  query.SelectList(list => list
   //.Select(() => entity.PrimaryID).WithAlias(() => resultAlias.PrimaryID)
   //.Select(() => entity.SecondaryID).WithAlias(() => resultAlias.SecondaryID)
   .Select(entity => entity.PrimaryID).WithAlias(() => resultAlias.PrimaryID)
   .Select(entity => entity.SecondaryID).WithAlias(() => resultAlias.SecondaryID)
    );
}

entity теперь является параметром переданного Function, и его тип берется из определения IQueryOver

1
Radim Köhler 18 Окт 2019 в 07:05