古いアプリケーションをNhibernateに移植する処理中です。
古いアプリケーションでは、ORACLEパッケージが広く使用されています。
私はいくつかのテーブルをマッピングし始めており、非常にうまくいくようです。 [CompanyCode]がフィルタである注文と注文行をサブクエリで取得する
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];
:
は今、私はQueryOverを経由して管理できるようにしたいと思い、このクエリを持っている...または類似した何か。
私は、マッピングファイル(受注及び注文ライン)に持っていると私の関連は次のようになります。
<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と注文番号です。
私は注文を照会し、各注文の行数を取得したいと思います。
は私が注文マッピングの式のプロパティ(そのためのおかげで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')" />
を私は怖い私の顧客は1日、これらの厄介なフィルタを変更することを決めたと私かもしれませんプロジェクト全体を再コンパイルする必要があります。
サブクエリ(QueryOver)で同じ結果を得る方法はありますか?
ご協力いただきありがとうございます。
_「サブクエリで同じ結果を得る方法」_ >>非SQLサブクエリ、つまりコード内の動的クエリを意味しますか? – Abel
@Abel、私は式のプロパティを取り除き、可能であればサブクエリ(QueryOver)を使いたいと思います。 – LeftyX
数式は各行に対して実行され、遅延ロードはありません。したがって、大規模なデータセットではパフォーマンスがひどくなるでしょう。 –