Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在NHibernate中规划集合?_C#_Nhibernate_Queryover_Nhibernate Projections - Fatal编程技术网

C# 如何在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((

是否可以在NHibernate中对集合进行投影

例如:

用户
{
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();