0

ユーザーとロールのテーブルがあります。ユーザーは複数のロールを持つことができます。

特定の役割を持たないすべてのユーザーを取得したい。問題は、ユーザーに 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);
        }

より良い解決策を知っている人はいますか?ありがとう!

4

3 に答える 3

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 に答える
1

nhibernate でそれを行いたい場合は、2 つのクエリまたはサブクエリを実行する必要があります。ここに同様の投稿があります:

多対多の関係オブジェクトに対する FluentNHibernate クエリ

于 2012-02-12T03:17:12.807 に答える
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 に答える