NHibernate QueryOver 与 SelectList
Posted
技术标签:
【中文标题】NHibernate QueryOver 与 SelectList【英文标题】:NHibernate QueryOver with 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)
);
附加信息: - 映射是正确的 - 表格中填满了测试数据
【问题讨论】:
【参考方案1】:我们不需要别名来填充 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
定义
【讨论】:
效果很好。如果在 SelectList 中使用了多个实体,我还必须使用别名还是有更好的方法? 别名很有用。在这里,我将展示如何以更强大的方式使用它***.com/q/26893475 .. 享受 NHibernate ;)以上是关于NHibernate QueryOver 与 SelectList的主要内容,如果未能解决你的问题,请参考以下文章
NHibernate Query<> 与 QueryOver<> 有啥区别?
NHibernate QueryOver 与 Fetch 产生多个 sql 查询和数据库命中
使用 NHibernate 3.0 QueryOver 或 LINQ 提供程序的权衡
如何使用 NHibernate QueryOver 重新创建这个复杂的 SQL 查询?