Я в процессе портирования старого приложения на 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>
Первичный ключ для моей таблицы Orders - CompanyCode и OrderNumber .
Я хотел бы запросить ордера и получить количество строк для каждого ордера.
Я добился того, чего хочу, добавив свойство формулы (спасибо Айенде за это) в отображение заказа:
<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)?
Заранее спасибоза вашу помощь.