繁体   English   中英

NHibernate QueryOver 与 SelectList

[英]NHibernate QueryOver with SelectList

我对一张表有多个查询。 由于并非所有列/属性都需要,我在 select 列表的帮助下指定列。 以下面的方法为例。 这个方法有效

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)
    );
}

附加信息:
- 映射是正确的
- 表格充满了测试数据

我们不需要别名来填充 SelectList。 我们可以从IQueryOver<TRoot,TSubType>的 Type 参数中获益:

//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定义

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM