powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Nhibernate. Помогите создать критерию с NOT EXISTS!
11 сообщений из 11, страница 1 из 1
Nhibernate. Помогите создать критерию с NOT EXISTS!
    #36753515
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, коллеги!
Попробую упростить условие задачи, чтобы не утомлять вас своими заморочками.
Итак, представим себе бюрократическую контору с высокой "бумажной дисциплиной".
Перед коллективом конторы ставится задача Task, которую будут последовательно выполнять несколько сотрудников, каждый из которых выбирает следующего исполнителя по своему усмотрению. Задачу создал начальник и назначил первого исполнителя.
Причем, оповестил его специальным Order-ом. Исполнитель глянул на ордер, проверил, все ли ему дали для исполнения и акцептовал ордер (или отверг - но мы этот прецедент отбросим). Как закончит исполнитель свою часть работы над задачей - надо передавать следующему. А для этого - создать новый ордер, где уже он будет инициатором, а следующий сотрудник - исполнителем. Это - цикл!
Надо показать каждому сотруднику его "органайзер" - список актуальных задач на данный момент.
Актуальной считается та, по которой у данного сотрудника есть акцептованный им ордер (в котором он значится исполнителем), но нет более позднего ордера, где он значится инициатором, и акцептованного следующим исполнителем.
SQL-запрос мною рожается быстро, а вот Criteria - как тот Каменный цветок ;(
Если отбросить условности, мне нужны ордера по задачам (уж соединения я вытащу)
Код: plaintext
1.
2.
3.
4.
5.
6.
select * from ORDERS O1
where O1.EXECUTOR_ID = :EXECUTOR_ID 
and O1.ACCEPTED = 1
and not exists (select 1 from ORDERS O2 
                where O2.INITIATOR_ID = O1.EXECUTOR_ID 
                and O2.TASK_ID = O1.TASK_ID 
                and O2.ACCEPTED = 1)
...
Рейтинг: 0 / 0
Nhibernate. Помогите создать критерию с NOT EXISTS!
    #36753759
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,

Используется HQL. В нём поддерживается оператор exists.
...
Рейтинг: 0 / 0
Nhibernate. Помогите создать критерию с NOT EXISTS!
    #36753784
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо HQL. Достаточно заюзать Expression.Not + Expression.In
...
Рейтинг: 0 / 0
Nhibernate. Помогите создать критерию с NOT EXISTS!
    #36753867
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
        public IList<Order> GetOrdersActualFromUser(string userName)
        {
            ICriteria criteria = _session.CreateCriteria<Order>("AcceptedOrders")
                .Add(Expression.Eq("ACTUAL", 1))
                .CreateCriteria("Initiator")
                    .Add(Expression.Eq("LOGIN", userName));

            DetachedCriteria nextOrderCriteria = DetachedCriteria.For<Order>("NextOrders")
                .SetProjection(Projections.Property("NextOrders.ID"))
                .Add(Restrictions.Eq("NextOrders.ACTUAL", 1))
                .Add(Restrictions.EqProperty("NextOrders.Initiator", "AcceptedOrders.Executor"))
                .Add(Restrictions.EqProperty("NextOrders.Task", "AcceptedOrders.Task"));


            IList<Order> result = criteria
                .Add(Subqueries.NotExists(nextOrderCriteria))
                .List<Order>();
            return result;
        }

Весь мосх растерял, пока придумывал. Теперь даже проверить не могу толком :-/
Ребята! Может поможете?!!
...
Рейтинг: 0 / 0
Nhibernate. Помогите создать критерию с NOT EXISTS!
    #36753947
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorКурдль,

Используется HQL. В нём поддерживается оператор exists.

Спасибо! Эдак я могу и до SQL-я докатиться - в нем тоже exists поддерживается! ;)
Но хочется ж доказать (себе), что не зря меня в ВУЗе реляционной алгебре учили!
...
Рейтинг: 0 / 0
Nhibernate. Помогите создать критерию с NOT EXISTS!
    #36753958
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, как вариант, на Subqueries.NotExists (Northwind):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT C.CategoryID,
       C.CategoryName
FROM   Categories C
WHERE  NOT EXISTS (
           SELECT  1 
           FROM   Products P
           WHERE  P.CategoryID = C.CategoryID
                  AND UnitPrice >  82 
       )

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
var results = session.CreateCriteria<Category>("c")
    .Add(Subqueries.NotExists(
        DetachedCriteria.For<Product>("p")
        .SetProjection(Projections.Constant(1))
        .Add(Restrictions.EqProperty("c.CategoryID", "p.Category.CategoryID"))
        .Add(Restrictions.Gt("UnitPrice", 82.0))
    ))
    .List<Category>(); 
...
Рейтинг: 0 / 0
Nhibernate. Помогите создать критерию с NOT EXISTS!
    #36753966
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУНе надо HQL. Достаточно заюзать Expression.Not + Expression.In
Каким образом, если не секрет, воспользоваться этими методами, если в выборке участвуют разные кортежи одной сущности?
...
Рейтинг: 0 / 0
Nhibernate. Помогите создать критерию с NOT EXISTS!
    #36753979
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльМСУНе надо HQL. Достаточно заюзать Expression.Not + Expression.In
Каким образом, если не секрет, воспользоваться этими методами, если в выборке участвуют разные кортежи одной сущности?

Всё дело в волшебных пузырьках:

Код: plaintext
1.
2.
3.
4.
5.
SELECT C.CategoryID, C.CategoryName
FROM Categories C
WHERE NOT EXISTS (
	SELECT * FROM Products P
	WHERE P.CategoryID = C.CategoryID AND UnitPrice >  82 
)

Код: plaintext
1.
2.
3.
4.
5.
SELECT C.CategoryID, C.CategoryName
FROM Categories C
WHERE C.CategoryID NOT IN (
	SELECT P.CategoryID FROM Products P
	WHERE P.CategoryID = C.CategoryID AND UnitPrice >  82 
)

Эти два запроса идентичны. Планы выполнения совпадают.
...
Рейтинг: 0 / 0
Nhibernate. Помогите создать критерию с NOT EXISTS!
    #36754022
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Мне не кажется, что план запроса будет одинаков, но спорить лень ;)

Однако, я имел в виду не SQL а Criteria-выражения и их использование в контексте "Expression.Not + Expression.In"
...
Рейтинг: 0 / 0
Nhibernate. Помогите создать критерию с NOT EXISTS!
    #36754033
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльМСУ, Мне не кажется, что план запроса будет одинаков, но спорить лень ;)
Чтобы не казалось, нужно не спорить, а проверить. Тогда казаться перестанет :)
КурдльОднако, я имел в виду не SQL а Criteria-выражения и их использование в контексте "Expression.Not + Expression.In"
Тут я скорее всего погорячился. Без DetachedCriteria никак.
...
Рейтинг: 0 / 0
Nhibernate. Помогите создать критерию с NOT EXISTS!
    #36756996
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИТОГ:
Проверка моего решения (http://www.sql.ru/forum/actualpost.aspx?bid=12&tid=776071&mid=9142410&p=1#9141921) показала, что оно верное и работает, как задумано.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Nhibernate. Помогите создать критерию с NOT EXISTS!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]