Коллекция запросов NHibernate - PullRequest
       33

Коллекция запросов NHibernate

0 голосов
/ 12 февраля 2012

У меня есть таблица пользователей и ролей. Пользователь может иметь несколько ролей.

Я хочу захватить всех пользователей без определенной роли. Проблема в том, что если у пользователя есть две роли, одна из которых нам не нужна, он все равно будет возвращен.

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 ]

1 голос
/ 12 февраля 2012

В качестве альтернативы вы можете использовать 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>();
1 голос
/ 12 февраля 2012

Если вы хотите сделать это в nhibernate, вам придется выполнить два запроса или подзапрос.Вот похожий пост:

Запрос FluentNHibernate для объектов отношения многие ко многим

0 голосов
/ 12 февраля 2012

Спасибо, для всех, кто интересуется, вот чем я закончил:

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