×

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, полученному из подзапроса?

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Не очень понятно, как связать и как добавить возвращение свойства? Алиас и сейчас вроде как есть: «.Add (Projections.Alias (», но это не спасает.

Можете примерно код набросать, чтоб я понял о каких вообще классах/методах речь?

Правда с сортировкой по алиасам там тоже есть проблемы... Но попроще

Если в основном запросе связать эти две таблицы и добавить возвращение этого свойста (по которому будет происходить сортировка) то НХибернейт добавит ему АЛИАС.
Вот по этому АЛИАСу и делай сортировку.

Это ситуация подобна той, когда ты делаешь сортировку по свойству, которое мепится на формулу (запрос).

Підписатись на коментарі