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