C# NHibernate使用SelectList进行查询

C# NHibernate使用SelectList进行查询,c#,nhibernate,orm,projection,queryover,C#,Nhibernate,Orm,Projection,Queryover,我对一个表有多个查询。由于并非所有列/属性都是必需的,因此我在选择列表的帮助下指定了这些列。以下面的方法为例。这种方法是有效的 public IEnumerable<ResultDto> GetEntityAsDto(eStatusBinderProduktion fromState, eStatusBinderProduktion toState) { EntityClass entityAlias = null; ResultDto resultAlias = n

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

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>();
}
public IEnumerable GetEntityAsDto(status BinderProducation from State,status BinderProducation to State)
{
EntityClass entityAlias=null;
ResultDto resultAlias=null;
var query=Session.QueryOver(()=>entityAlias)
.Where(()=>entityAlias.ProduktionStatus>=(字节)fromState)
.和(()=>entityAlias.ProduktionStatus列表
。选择(()=>entityAlias.PrimaryID)。使用别名(()=>resultAlias.PrimaryID)
.Select(()=>entityAlias.SecondaryID).WithAlias(()=>resultAlias.SecondaryID)
);
返回query.TransformUsing(Transformers.AliasToBean())
.List();
}
由于需要在多个方法中定义SelectList,我尝试将SelectList移动到单独的方法中

以下代码不工作,NHibernate引发异常

NHibernate.QueryException:'无法解析属性:entity.PrimaryID of:MyProjectNamespace.DAL.Interfaces.Entities.EntityClass' "

public IEnumerable GetEntityAsDto(status BinderProducation from State,status BinderProducation to State)
{
EntityClass entityAlias=null;
ResultDto resultAlias=null;
var query=Session.QueryOver(()=>entityAlias)
.Where(()=>entityAlias.ProduktionStatus>=(字节)fromState)
.和(()=>entityAlias.ProduktionStatus列表
.Select(()=>entity.PrimaryID)。带别名(()=>resultAlias.PrimaryID)
.Select(()=>entity.SecondaryID).WithAlias(()=>resultAlias.SecondaryID)
);
}
其他信息:
-映射是正确的

-表中填充了测试数据

我们不需要别名来填充选择列表。我们可以从
IQueryOver
附带的类型参数中获益:

//私有void MapPropertiesFentityToResult(EntityClass实体)
//,ResultTo resultAlias,IQueryOver查询)
私有void MapPropertiesFentityToResult(//不需要实体
ResultTo resultAlias,IQueryOver查询)
{
query.SelectList(list=>list
//.Select(()=>entity.PrimaryID)。带别名(()=>resultAlias.PrimaryID)
//.Select(()=>entity.SecondaryID).WithAlias(()=>resultAlias.SecondaryID)
.Select(entity=>entity.PrimaryID).WithAlias(()=>resultAlias.PrimaryID)
.Select(entity=>entity.SecondaryID).WithAlias(()=>resultAlias.SecondaryID)
);
}

实体
现在是传递的
函数
的一个参数,它的类型来自
IQueryOver
定义

非常有效。如果选择列表中使用了多个实体,我还需要使用别名吗?还是有更好的方法?别名很有用。在这里,我展示了如何以更强大的方式使用它。享受NHibernate;)
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)
    );
}
//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)
    );
}