C# 如何在NHibernate中规划集合?
是否可以在NHibernate中对集合进行投影 例如:C# 如何在NHibernate中规划集合?,c#,nhibernate,queryover,nhibernate-projections,C#,Nhibernate,Queryover,Nhibernate Projections,是否可以在NHibernate中对集合进行投影 例如: 用户 { UserGuid, IList用户组, } 用户userEntity=null; _会议 .StatefulSession.QueryOver(()=>userEntity) .SelectList(list=>list .Select(x=>x.UserGuid).WithAlias(()=>userEntity.UserGuid) //如何在此处创建项目组集合? .Select(x=>x.Groups).WithAlias((
用户
{
UserGuid,
IList用户组,
}
用户userEntity=null;
_会议
.StatefulSession.QueryOver(()=>userEntity)
.SelectList(list=>list
.Select(x=>x.UserGuid).WithAlias(()=>userEntity.UserGuid)
//如何在此处创建项目组集合?
.Select(x=>x.Groups).WithAlias(()=>userEntity.Groups)
)
.TransformUsing(Transformers.AliasToBean())
.List();
我们必须将投影作为一个SELECT子句来处理。在DB端我们可以用它做什么,我们可以用QueryOver
进行模拟。所以,在这种情况下,我们可以加入用户
和组
,并从用户和组中分别投影少量属性。最好的目标是一些DTO
语法可以如下所示:
ResultDTO resultDTO = null; // the target to be returned
Group groupEntity = null;
User userEntity = null;
_session.StatefulSession
.QueryOver(() => userEntity)
.JoinAlias(() => userEntity.Groups, () => groupEntity)
.SelectList(list => list
.Select(x => x.UserGuid).WithAlias(() => resultDTO.UserGuid)
// more about User - targeting the ResultDTO
...
// almost the same for Group properties
.Select(x => groupEntity.Name).WithAlias(() => resultDTO.GroupName)
..
)
.TransformUsing(Transformers.AliasToBean<ResultDTO >())
.List();
解决此问题的一种方法是跳过SelectList()
(不要使用投影)并要求NHiberante使用不同的转换:
_session.StatefulSession
.QueryOver(() => userEntity)
.JoinAlias(() => userEntity.Groups, () => groupEntity)
.TransformUsing(Transformers.DistinctRootEntity)
.List();
不错,有人会说,但它又错了。没有有效的分页是可能的,因为对每个用户来说更多行的效果仍然存在。因此,如果我们说Take(2)
,我们将只得到用户A。事实上,原因是隐藏的,缩小是在内存中,在.NET/应用层侧进行的,而不是在DB中
建议:不要在一对多关系中使用任何联接。将分离查询与强大的NHibernate功能结合使用:
另请参见:
_session.StatefulSession
.QueryOver(() => userEntity)
.JoinAlias(() => userEntity.Groups, () => groupEntity)
.TransformUsing(Transformers.DistinctRootEntity)
.List();