2015-02-09 87 views
0

我正在学习QueryOver的过程中,但我无法弄清楚如何做一个简单的多对多查询。NHibernate与多对多的QueryOver

我有三个表,用户,角色和结UserRoles。

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

我的表的连接是这样的:

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

我试图使用QueryOver基本替代的选择了spefic用户名中的作用:

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) 

类:

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; } 
} 

地图坪:

<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> 

我试过的东西,但我还差得远:

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

你能告诉你的映射?正确的查询取决于这些类是如何映射到对方与NHibernate – 2015-02-09 19:57:54

+0

@AndrewWhitaker编辑的问题,包括映射,谢谢。 – 2015-02-10 07:52:05

+0

@AndrewWhitaker offtopic:看起来你的名字对我来说很熟悉,因为昨天我检查了你的一些博客帖子,嘿嘿:) – 2015-02-10 08:05:46

回答

2

这个连接应该只是实际工作。我想你想要的是用户而不是角色。所以你可能需要使用类似:

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

否,我想根据用户名选择角色,并且我得到这个错误代码:error CS1593:Delegate 'System.Func '不带1个参数 错误CS0029:无法将类型'int'隐式转换为'UserManager.Domain.Users' 错误CS1662:无法将lambda表达式转换为委托类型'系统。 Func ',因为在这种情况下,块中的某些返回类型不会隐式地转换为委托返回类型 – 2015-02-09 15:44:01

+0

,为什么不只是通过用户名选择用户,角色? Session.QueryOver ().Where(x => x.Id == userId).Take(1).SingelOrDefault()。角色 – 2015-02-10 14:42:13

0

按我的了解NHibernate的理解,你有目前不允许你在做一个适当的查询的映射,但是如果你可以改变至少的UserRole实体,

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

然后你可以用下面的达到你想要什么,

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