2012-02-12 121 views
0

我有一个用户和角色表。用户可以有多个角色。NHibernate查询集合

我想抓住所有没有特定角色的用户。问题是如果一个用户有两个角色,一个是我们不想要的角色,那么用户仍然会被退回。

public IList<User> GetUserByWithoutRole(string role) 
    { 
     return CreateQuery((ISession session) => session.CreateCriteria<User>() 
      .CreateAlias("Roles", "Roles") 
      .Add(!Restrictions.Eq("Roles.RoleDescription", role)) 
      .List<User>()); 
    } 

我想出的唯一解决办法是客户端

public IEnumerable<User> GetUserByWithoutRole(string role) 
     { 
      return CreateQuery((ISession session) => session.CreateCriteria<User>() 
       .CreateAlias("Roles", "Roles") 
       .Add(!Restrictions.Eq("Roles.RoleDescription", role)) 
       .List<User>()).Where(u => u.Roles.FirstOrDefault(r => r.RoleDescription == role) == null); 
     } 

任何人都知道一个更好的解决方案?谢谢!

回答

1

或者您可以使用标准的API来创建子查询

var subquery = DetachedCriteria.For<Role>("role"); 
subquery.Add(Restrictions.EqProperty("role.User.id", "user.id")) 
    .SetProjection(Projections.Property("role.RoleDescription")); 

var users = session.CreateCriteria<User>("user") 
    .Add(Subqueries.NotIn(role, subquery)) 
    .List<User>(); 
0

谢谢,有兴趣的人士,这是我完成了:

public IEnumerable<User> GetUserByWithoutRole(string role) 
     { 
      var subQuery = DetachedCriteria.For<User>() 
      .CreateAlias("Roles", "Roles") 
      .SetProjection(Projections.Property("UserID")) 
      .Add(Restrictions.Eq("Roles.RoleDescription", role)); 

      return _session.CreateCriteria<User>() 
      .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
      .Add(Subqueries.PropertyNotIn("UserID", subQuery)) 
      .AddOrder(Order.Asc("FirstName")) 
      .List<User>(); 
     }