如何使用NHibernate将两个不同实体中选定的列选择到一个DTO中?

如何使用NHibernate将两个不同实体中选定的列选择到一个DTO中?,nhibernate,join,fluent-nhibernate,Nhibernate,Join,Fluent Nhibernate,我有两个课程(只是重新创建问题): 我完全迷路了,我尝试了很多不同的选择。使用普通SQL查询几乎可以正常工作,但由于用户类AliasToBean中有一些可为空的枚举无法转换,否则包装SQL查询的工作方式如下: return Session .CreateSQLQuery(sql) .SetParameter("ouid", orgUnitId) .SetResultTransformer(Transformers.AliasToBean&l

我有两个课程(只是重新创建问题):

我完全迷路了,我尝试了很多不同的选择。使用普通SQL查询几乎可以正常工作,但由于用户类AliasToBean中有一些可为空的枚举无法转换,否则包装SQL查询的工作方式如下:

return
    Session
        .CreateSQLQuery(sql)
        .SetParameter("ouid", orgUnitId)
        .SetResultTransformer(Transformers.AliasToBean<UserDTO>())
        .List<UserDTO>()
返回
一场
.CreateSQLQuery(sql)
.SetParameter(“ouid”,orgUnitId)
.SetResultTransformer(Transformers.AliasToBean())
.List()
我尝试了下面的代码作为测试(几个不同的变体),但我不确定我在做什么。它部分工作,我得到UserDTO的实例,来自OrgUnitMembership(日期)的属性被填充,但是来自User的所有属性都为null:

User user = null;
                OrgUnitMembership membership = null;
                UserDTO dto = null;
                var users = Session.QueryOver(() => user)
                    .SelectList(list => list
                        .Select(() => user.Id)
                        .Select(() => user.FirstName)
                        .Select(() => user.LastName))
                    .JoinAlias(u => u.OrgUnitMemberships, () => membership)
                    //.JoinQueryOver<OrgUnitMembership>(u => u.OrgUnitMemberships)
                    .SelectList(list => list
                        .Select(() => membership.JoinDate).WithAlias(() => dto.JoinDate)
                        .Select(() => membership.LeaveDate).WithAlias(() => dto.LeaveDate))
                    .TransformUsing(Transformers.AliasToBean<UserDTO>())
                    .List<UserDTO>();
User=null;
OrgUnitMembership=null;
UserDTO-dto=null;
var users=Session.QueryOver(()=>user)
.SelectList(list=>list
.选择(()=>user.Id)
.选择(()=>user.FirstName)
.选择(()=>user.LastName))
.JoinAlias(u=>u.OrgUnitMemberships,()=>membership)
//.JoinQueryOver(u=>u.OrgUnitMemberships)
.SelectList(list=>list
。选择(()=>membership.JoinDate)。使用别名(()=>dto.JoinDate)
。选择(()=>membership.LeaveDate)。使用别名(()=>dto.LeaveDate))
.TransformUsing(Transformers.AliasToBean())
.List();

如此接近。。只需加入您的2个SelectList方法-您的别名将确保NHibernate从正确的实体获得正确的属性:

User user = null;
OrgUnitMembership membership = null;
UserDTO dto = null;
var users = Session.QueryOver(() => user)
    .JoinAlias(u => u.OrgUnitMemberships, () => membership)
    //.JoinQueryOver<OrgUnitMembership>(u => u.OrgUnitMemberships)
    .SelectList(list => list
        .Select(() => user.Id)
        .Select(() => user.FirstName)
        .Select(() => user.LastName))
        .Select(() => membership.JoinDate).WithAlias(() => dto.JoinDate)
        .Select(() => membership.LeaveDate).WithAlias(() => dto.LeaveDate))
    .TransformUsing(Transformers.AliasToBean<UserDTO>())
    .List<UserDTO>();
User=null;
OrgUnitMembership=null;
UserDTO-dto=null;
var users=Session.QueryOver(()=>user)
.JoinAlias(u=>u.OrgUnitMemberships,()=>membership)
//.JoinQueryOver(u=>u.OrgUnitMemberships)
.SelectList(list=>list
.选择(()=>user.Id)
.选择(()=>user.FirstName)
.选择(()=>user.LastName))
。选择(()=>membership.JoinDate)。使用别名(()=>dto.JoinDate)
。选择(()=>membership.LeaveDate)。使用别名(()=>dto.LeaveDate))
.TransformUsing(Transformers.AliasToBean())
.List();

如此接近……:P但说真的,它是有效的,我只需要对每个字段使用
.WithAlias()
。谢谢
return
    Session
        .CreateSQLQuery(sql)
        .SetParameter("ouid", orgUnitId)
        .SetResultTransformer(Transformers.AliasToBean<UserDTO>())
        .List<UserDTO>()
User user = null;
                OrgUnitMembership membership = null;
                UserDTO dto = null;
                var users = Session.QueryOver(() => user)
                    .SelectList(list => list
                        .Select(() => user.Id)
                        .Select(() => user.FirstName)
                        .Select(() => user.LastName))
                    .JoinAlias(u => u.OrgUnitMemberships, () => membership)
                    //.JoinQueryOver<OrgUnitMembership>(u => u.OrgUnitMemberships)
                    .SelectList(list => list
                        .Select(() => membership.JoinDate).WithAlias(() => dto.JoinDate)
                        .Select(() => membership.LeaveDate).WithAlias(() => dto.LeaveDate))
                    .TransformUsing(Transformers.AliasToBean<UserDTO>())
                    .List<UserDTO>();
User user = null;
OrgUnitMembership membership = null;
UserDTO dto = null;
var users = Session.QueryOver(() => user)
    .JoinAlias(u => u.OrgUnitMemberships, () => membership)
    //.JoinQueryOver<OrgUnitMembership>(u => u.OrgUnitMemberships)
    .SelectList(list => list
        .Select(() => user.Id)
        .Select(() => user.FirstName)
        .Select(() => user.LastName))
        .Select(() => membership.JoinDate).WithAlias(() => dto.JoinDate)
        .Select(() => membership.LeaveDate).WithAlias(() => dto.LeaveDate))
    .TransformUsing(Transformers.AliasToBean<UserDTO>())
    .List<UserDTO>();