C# 具有子查询返回的NHibernate Linq';如果子查询未使用EXISTS';引入,则只能在选择列表中指定一个表达式;
我正在尝试使以下查询正常工作:C# 具有子查询返回的NHibernate Linq';如果子查询未使用EXISTS';引入,则只能在选择列表中指定一个表达式;,c#,linq,nhibernate,C#,Linq,Nhibernate,我正在尝试使以下查询正常工作: var users = session.Query<PersonUser>() .Select(u => new User() { Id = u.UserId, FirstName = u.UserFirstName, Surname = u.UserSurname, ActiveRoles = u.Roles.Select(rr => new Role() { Id = rr.RoleId, Display
var users = session.Query<PersonUser>()
.Select(u => new User()
{
Id = u.UserId,
FirstName = u.UserFirstName,
Surname = u.UserSurname,
ActiveRoles = u.Roles.Select(rr => new Role() { Id = rr.RoleId, DisplayName = rr.RoleName })
})
.ToList();
注:PersonUser
和PersonRole
是POCO数据库实体,User
和Role
是简单的DTO<代码>个人用户。角色是列表映射的多个角色
我如何才能让NH正确地向用户
DTO投射,包括它与角色的多对多关系
DTO?
非常感谢您的帮助 sqlserver似乎不接受该查询,因为子查询返回多个列。您可以使用:
var users = session.Query<PersonUser>()
.Fetch(u => u.Roles).Eager
.AsEnumerable()
.Select(u => new User
{
Id = u.UserId,
FirstName = u.UserFirstName,
Surname = u.UserSurname,
ActiveRoles = u.Roles.Select(rr => new Role { Id = rr.RoleId, DisplayName = rr.RoleName }).ToList()
})
.ToList();
var users=session.Query()
.Fetch(u=>u.Roles)。急切
.可计算的()
.选择(u=>新用户
{
Id=u.UserId,
FirstName=u.UserFirstName,
姓氏=美国用户姓氏,
ActiveRoles=u.Roles.Select(rr=>newrole{Id=rr.RoleId,DisplayName=rr.RoleName})
})
.ToList();
谢谢。您的工作正常,但我需要避免将所有内容加载到内存中,因此我无法使用.AsEnumerable()
,否则它将无法工作。我添加了.ToList()只是为了测试。实际上,我需要运行更复杂的查询,但我不知道如何正确填充“ActiveRoles”。“我需要避免将所有内容加载到内存中”有这么多属性?注意:仍然可以设置分页。另一种只获取所需内容的方法是CreateSqlQuery
或IResultTransformer
NHibernate现在不支持此类子查询,我得到了完全相同的错误
var users = session.Query<PersonUser>()
.Fetch(u => u.Roles).Eager
.AsEnumerable()
.Select(u => new User
{
Id = u.UserId,
FirstName = u.UserFirstName,
Surname = u.UserSurname,
ActiveRoles = u.Roles.Select(rr => new Role { Id = rr.RoleId, DisplayName = rr.RoleName }).ToList()
})
.ToList();