Я занимаюсь портированием старого приложения в Nhibernate.
Старое приложение широко использует пакеты ORACLE, и я хочу избавиться от этого.
Я начал сопоставлять несколько таблиц, и, похоже, все работает очень хорошо.
Теперь у меня есть запрос, которым я хотел бы управлять через QueryOver... или что-то подобное:
SELECT
Orders.*
(SELECT COUNT(*) FROM OrderLines
WHERE OrderLines.CompanyCode = Orders.CompanyCode
AND OrderLines.OrderNumber = Orders.OrderNumber
AND NOT (OrderLines.OCLSCOM = 'Y' AND OrderLines.OCLSSEQ = 0)
AND OrderLines.Status = 'R') OrderLinesCount
FROM
Orders
WHERE
AND Orders.CompanyCode = [CompanyCode];
[CompanyCode] – это фильтр.
Мне нужно сопоставить файлы (Orders и OrderLines), и моя ассоциация выглядит так:
<class name="Order" table="Orders">
...
<set name="OrderLines" access="field.pascalcase-underscore" inverse="true" lazy="extra" cascade="none">
<key>
<column name="OrderNumber" not-null="true"/>
<column name="CompanyCode" not-null="true"/>
</key>
<one-to-many class="OrderLine" not-found ="ignore"/>
</set>
</class>
Первичный ключ для моей таблицы заказов — CompanyCode и OrderNumber.
Я хотел бы запросить заказы и получить количество строк для каждого заказа.
Я добился того, чего хотел, добавив свойство формулы (спасибо Ayende за это) в отображении заказа:
<property name="OrderLinesCount" formula="(SELECT COUNT(*) FROM OrderLines WHERE OrderLines.CompanyCode = CompanyCode AND OrderLines.OrderNumber = OrderNumber AND NOT (OrderLines.OCLSCOM = 'Y' AND OrderLines.OCLSSEQ = 0) AND OrderLines.Status = 'R')" />
но я боюсь, что мой клиент однажды решит изменить эти неприятные фильтры, и мне придется перекомпилировать весь проект.
Есть ли способ добиться того же результата с помощью подзапроса (QueryOver)?
Заранее спасибо за помощь.