NHibernate查询集合

时间:2012-02-12 01:57:21

标签: nhibernate collections restriction createcriteria

我有一个用户和角色表。用户可以拥有多个角色。

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

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

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

3 个答案:

答案 0 :(得分:1)

如果你想在nhibernate中这样做,你将不得不做两个查询或一个子查询。这是一个类似的帖子:

FluentNHibernate query on many-to-many relationship objects

答案 1 :(得分:1)

或者,您可以使用Criteria 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>();

答案 2 :(得分: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>();
        }