简体   繁体   English

NHibernate QueryOver与多对多

[英]NHibernate QueryOver with Many-to-Many

I'm in the process of learning QueryOver, but I can't figure out how to do a simple many to many query. 我正在学习QueryOver,但是我不知道如何进行简单的多对多查询。

I have three tables, Users, Roles, and a junction UserRoles. 我有三个表,Users,Role和一个联结UserRoles。

Users       UserRoles         Roles
=======     =============     =========
UserId      UserId            RoleId
Username    RoleId            Role
Firstname   Date

My tables are joined like this: 我的表是这样连接的:

Users.UserId -> UserRoles.UserId
Roles.RoleId -> UserRoles.RoleId 

I'm trying to select the role for a spefic username using QueryOver basically the alternative for: 我试图使用QueryOver为特定的用户名选择角色,基本上是:

SELECT 
    dbo.Roles.Role 
FROM dbo.Roles 
INNER JOIN dbo.UserRoles 
    ON dbo.Roles.RoleId = dbo.UserRoles.RoleId 
INNER JOIN dbo.Users 
    ON dbo.UserRoles.UserId = dbo.Users.UserId 
WHERE (Username = @Username)

Classes: 类:

public class Roles
{
    public virtual int RoleId { get; set; }
    public virtual string Role { get; set; }
}
public class UserRoles
{
    public virtual int UserId { get; set; }
    public virtual int RoleId { get; set; }
    public virtual DateTime Date { get; set; }
}
public class Users
{
    public virtual int UserId { get; set; }
    public virtual string Username { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string Email { get; set; }
    public virtual DateTime Date { get; set; }
}

Mappings: 映射:

<class name="Roles">
<id name="RoleId">
  <generator class="native" />
</id>
<property name="Role" />
</class>

<class name="UserRoles">
<property name="UserId" />
<property name="RoleId" />
<property name="Date" />
</class>

<class name="Users">
<id name="UserId">
<generator class="native" />
</id>
<property name="Username" />
<property name="FirstName" />
<property name="LastName" />
<property name="Email" />
<property name="Date" />
</class>

I've tried something, but I'm not even close: 我已经尝试了一些东西,但是我还没有接近:

var result = session.QueryOver<Users>()
            .Right.JoinQueryOver<Roles>(x => x.UserId )
            .Where(c => c.RoleId == roleid)
            .List();

This join should just work actually. 这种连接实际上应该可以正常工作。 I think you want the users and not the roles. 我认为您需要用户而不是角色。 so you might want to use something like: 所以您可能想使用类似以下的内容:

var result = session.QueryOver<Users>()
            .Right.JoinQueryOver<Roles>(x => x.UserId )
            .Where(c => c.RoleId == roleid)
.TransformUsing(Transformers.DistinctRootEntity)
.List();

As per my understanding about NHibernate, the mappings you have currently do not allow you to do a proper query over, but If you can change the at least UserRoles entity as, 根据我对NHibernate的了解,您当前所拥有的映射不允许您进行适当的查询,但是如果您可以将至少UserRoles实体更改为

    public class UserRoles
    {
        public virtual int Id { get; set; }
        public virtual Users Users { get; set; }
        public virtual Roles Roles { get; set; }
    }

Then you can use following to achieve what you want, 然后,您可以使用以下代码来实现所需的功能,

    Users users = null;
    UserRoles userRoles = null;


    var query = session.QueryOver(() => userRoles)
        .JoinQueryOver(() => userRoles.Users, () => users)
        .Where(() => users.Username == "test")
        .Select(r => r.Roles)
        .TransformUsing(Transformers.DistinctRootEntity);

    var results = query.List();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM