Search code examples
nhibernatequeryover

QueryOver Many to Many with a single SQL join


I've got 2 entities, linked many-to-many. (Product & User) I want to restrict Products by Users:

User userAlias = null;
query.JoinAlias(product => product.Users, () => userAlias)
  .Where(() => userAlias.Id == currentUser.Id);

It's generated SQL code:

SELECT this_.Id as y0_
FROM   [Product] this_
       inner join UserToProduct users5_
         on this_.Id = users5_.Product_id
       inner join [User] useralias3_
         on users5_.User_id = useralias3_.Id
....

In "Where" i use only user_id and i don't need second join.

How I can write the query(by QueryOver) with a single SQL join ?


Solution

  • This may help? I have a similar setup with UsersRoles

    Role roleAlias = null;
    var roles = _session.QueryOver<UsersRole>().JoinAlias(x => x.Role, () => roleAlias, JoinType.LeftOuterJoin).Where(
                x => x.User.UserId == userId).List();
    

    produces the following:

    SELECT this_.UsersRolesId         as UsersRol1_32_1_,
           this_.UserId               as UserId32_1_,
           this_.RoleId               as RoleId32_1_,
           rolealias1_.RoleId         as RoleId27_0_,
           rolealias1_.RoleName       as RoleName27_0_,
           rolealias1_.Active         as Active27_0_,
           rolealias1_.DateCreated    as DateCrea4_27_0_,
           rolealias1_.LastUpdated    as LastUpda5_27_0_,
           rolealias1_.RoleSettingsId as RoleSett6_27_0_
    FROM   UsersRoles this_
           left outer join Roles rolealias1_
             on this_.RoleId = rolealias1_.RoleId
    WHERE  this_.UserId = 'a7eec4eb-21cc-4185-8847-a035010e779f' /* @p0 */