0

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

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

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

有人知道更好的解决方案吗?谢谢!

4

3 回答 3

1

如果您想在 nhibernate 中执行此操作,则必须执行两个查询或一个子查询。这是一个类似的帖子:

FluentNHibernate 查询多对多关系对象

于 2012-02-12T03:17:12.807 回答
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>();
于 2012-02-12T10:16:53.740 回答
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>();
        }
于 2012-02-12T10:42:05.563 回答