2011-08-05 25 views
4

古いアプリケーションを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)で同じ結果を得る方法はありますか?

ご協力いただきありがとうございます。

+0

_「サブクエリで同じ結果を得る方法」_ >>非SQLサブクエリ、つまりコード内の動的クエリを意味しますか? – Abel

+0

@Abel、私は式のプロパティを取り除き、可能であればサブクエリ(QueryOver)を使いたいと思います。 – LeftyX

+0

数式は各行に対して実行され、遅延ロードはありません。したがって、大規模なデータセットではパフォーマンスがひどくなるでしょう。 –

答えて

0

を取得するためにorder.OrderLinesFiltered.Countを呼び出すことができますフィルターは、nHibernateフィルターを使うと思うかもしれません。

1

あなたが探しているものではないかもしれませんが、コレクションのwhere句を考えましたか?私は変更する必要があります場合は、

<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')" /> 

ある日:あなたは、私は式のプロパティのために行くことにしました終わりに値

<set name="OrderLinesFiltered" table="OrderLines" 
access="field.pascalcase-underscore" inverse="true" lazy="extra" 
cascade="none" 
where=" NOT (OCLSCOM = 'Y' AND OCLSSEQ = 0) AND Status = 'R' "> 
    <key> 
    <column name="OrderNumber" not-null="true"/> 
    <column name="CompanyCode" not-null="true"/> 
    </key> 
    <one-to-many class="OrderLine" not-found ="ignore"/> 
</set> 
+0

はい、私はそれが各行のために実行されることを知っていますが、私はデータセットをフィルタリングするので、私は決していくつかの行以上を持っていません。あなたのことはいいアイデアですが、私は何か別の原因があると予想していました。 – LeftyX