我正在努力让以下查询工作:
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();
当我执行查询时,我得到以下内容:
NHibernate.Exceptions.GenericADOException occurred
Message=could not execute query
[ select personuser0_.USER_ID as col_0_0_, personuser0_.USER_FIRSTNAME as col_1_0_, personuser0_.USER_SURNAME as col_2_0_, (select personrole2_.ROLE_ID, personrole2_.ROLE_NAME from PERSON_ROLE_USER roles1_, PERSON_ROLE personrole2_ where personuser0_.USER_ID=roles1_.USER_ID and roles1_.ROLE_ID=personrole2_.ROLE_ID) as col_3_0_ from PERSON_USER personuser0_ ]
[SQL: select personuser0_.USER_ID as col_0_0_, personuser0_.USER_FIRSTNAME as col_1_0_, personuser0_.USER_SURNAME as col_2_0_, (select personrole2_.ROLE_ID, personrole2_.ROLE_NAME from PERSON_ROLE_USER roles1_, PERSON_ROLE personrole2_ where personuser0_.USER_ID=roles1_.USER_ID and roles1_.ROLE_ID=personrole2_.ROLE_ID) as col_3_0_ from PERSON_USER personuser0_]
Source=NHibernate
SqlString=select personuser0_.USER_ID as col_0_0_, personuser0_.USER_FIRSTNAME as col_1_0_, personuser0_.USER_SURNAME as col_2_0_, (select personrole2_.ROLE_ID, personrole2_.ROLE_NAME from PERSON_ROLE_USER roles1_, PERSON_ROLE personrole2_ where personuser0_.USER_ID=roles1_.USER_ID and roles1_.ROLE_ID=personrole2_.ROLE_ID) as col_3_0_ from PERSON_USER personuser0_
InnerException: System.Data.SqlClient.SqlException
Message=Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
Source=.Net SqlClient Data Provider
ErrorCode=-2146232060
Class=16
LineNumber=1
Number=116
Procedure=""
State=1
注意:PersonUser
和PersonRole
是POCO数据库实体,User
和Role
是简单的DTO。 PersonUser.Roles
是List映射的HasManyToMany。
我怎样才能让NH成为User
DTO的核心项目,包括与Role
DTO的多对多关系?
非常感谢帮助!
答案 0 :(得分:1)
似乎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();