2011-12-09 13 views
2

以下の取得:NHibernateはLINQの

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 

注:PersonUserPersonRole POCOのデータベース・エンティティであり、UserRoleはシンプルなDTOです。 PersonUser.RolesはリストマップHasManyToManyです。

どのようにして、NHをcorectlyにプロジェクトに導くことができますUser DTOは多対多の関係を含めてRole DTOに出荷されますか?

大変助かりました!

+0

NHibernateのは、今、このようなサブクエリ – hazzik

+0

のためにサポートしていません、私は正確に同じエラー – PJUK

答えて

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(); 
+0

感謝を取得します。あなたの作品は、私はすべてのメモリに読み込まれないようにする必要があるので、 '.AsEnumerable()'を使うことはできません。 私はtestのためだけに.ToList()を追加しました。実際にはもっと複雑なクエリを実行する必要がありますが、「ActiveRoles」を正しく配置する方法を理解できません。 – Honza

+0

"私はすべてをメモリにロードする必要はありません" PeronUserは非常に多くのプロパティを持っていますか?注:ページングを設定することはまだ可能です。必要なものだけを取得するもう1つの方法は、 'CreateSqlQuery'または' IResultTransformer'です – Firo

関連する問題