【问题标题】:NHibernate QueryOver with SelectListNHibernate QueryOver 与 SelectList
【发布时间】:2019-10-17 13:10:32
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# nhibernate orm projection queryover


    【解决方案1】:

    我们不需要别名来填充 SelectList。我们可以从 IQueryOver&lt;TRoot,TSubType&gt; 附带的 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 定义

    【讨论】:

    • 效果很好。如果在 SelectList 中使用了多个实体,我还必须使用别名还是有更好的方法?
    • 别名很有用。在这里,我将展示如何以更强大的方式使用它stackoverflow.com/q/26893475 .. 享受 NHibernate ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多