2012-02-12 1 views
0

私はusersとrolesテーブルを持っています。ユーザーは複数の役割を持つことができます。NHibernateクエリーコレクション

私は特定の役割を持たないすべてのユーザーをつかみたいと思っています。問題は、ユーザーが2つの役割を持っている場合です.1つは私たちが望まない役割であり、ユーザーはまだ返されます。

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

別の方法としては、サブクエリ

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

を作成するために、基準APIを使用することができますおかげで、興味のある人のために、これは私が仕上げたものです:

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