NHibernate. Сортировка по результату подзапроса (SqlProjection)
Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті
Коллеги, есть такая проблема.
Необходимо отсортировать результаты запроса согласно результатам сложного подзапроса по связанной таблице.
Есть таблица заказов ORDERS & связанная таблица счетов INVOICES (по INVOICES.ORDER_ID = ORDERS.ID).
Таблица INVOICES содержит флаг IS_OPEN. Заказ может быть (в зависимости от состояния флагов по его счетам): не оплачен (все INVOICES.IS_OPEN = true), частично оплачен (часть из INVOICES.IS_OPEN = true), оплачен полностью (все INVOICES.IS_OPEN! = true).
Я попробовал использовать SqlProjection и успешно получил только результат подзапроса
DetachedCriteria dc = DetachedCriteria.For<Order>();
IProjection proj = Projections.ProjectionList().Add(Projections.Alias(Projections.SqlProjection(@"(SELECT payedStatus =
case
when (SELECT COUNT(*) FROM INVOICE invoice WHERE invoice.IS_OPEN = 1 AND invoice.ORDER_ID = {alias}.ID) > 0
AND (SELECT COUNT(*) FROM INVOICE invoice WHERE invoice.IS_OPEN = 1 AND invoice.ORDER_ID = {alias}.ID) = (SELECT COUNT(*) FROM INVOICE invoice WHERE AND invoice.ORDER_ID = {alias}.ID
) then 1
when (SELECT COUNT(*) FROM INVOICE invoice
WHERE (SELECT COUNT(*) FROM INVOICE invoice WHERE invoice.IS_OPEN = 1 AND invoice.ORDER_ID = {alias}.ID) > 0 AND (SELECT COUNT(*) FROM INVOICE invoice WHERE invoice.IS_OPEN = 1 AND invoice.ORDER_ID = {alias}.ID)
<> (SELECT COUNT(*) FROM INVOICE invoice WHERE invoice.ORDER_ID = {alias}.ID) then 0
else 2
end) as payedStatus ", new[] { "payedStatus " }, new IType[] { NHibernateUtil.Int32 }), "PayedStatus"));
dc.SetProjection(proj)
.AddOrder(new Order("PayedStatus", Asc));
В данном случае, если я использую
return dc.GetExecutableCriteria(session ).List<Order>();
то получаю ексепшн. Если добавить перед этим
dc.SetResultTransformer(Transformers.AliasToBean(typeof(Order)));
то получаю список(List) пустых Order’ов. Я попытался добавить остальные свойства Order используя
.Add(Projections.Property(""))
, но получил тот же самый пустой List.
Каким способом можно отсортировать список заказов по PayedStatus, полученному из подзапроса?
3 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів