2012-02-12 129 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>(); 
     }