回答:
NHibernateセマンティクス:
リスト:エンティティの順序付けられたコレクション、重複が許可されています。IList
コードで.NET を使用します。インデックス列はNHibernateでマップする必要があります。
セット:一意のエンティティの順不同のコレクション。重複は許可されていません。Iesi.Collection.ISet
コードで使用(v4より前のNH)またはSystem.Collections.Generic.ISet
(NH v4 +)。重複のビジネス定義をオーバーライドGetHashCode
しEquals
て示すことが重要です。orderbyを定義するか、SortedSet
結果をもたらす比較子を定義することにより、ソートできます。
バッグ:エンティティの順序付けられていないリスト、重複が許可されています。ICollection<T>
コードで.NET を使用します。リストのインデックス列はマッピングされておらず、NHibernateによって受け入れられません。
NHibernateのこれらのオブジェクトはすべて、これらの抽象データ型(ADT)の他の実装とまったく同じです。名前が他のものと共通しているため、セットやバッグをオンラインで見つけるのがいかに難しいかに驚いたので、ここにいくつかのリンクと説明をリストしました。
詳細については、以下をご覧ください。 リスト、 セット、 バッグ
一般的なルールは次のとおりです。
リストはデフォルトで順序付けられています。オブジェクトをそのインデックスで引き出すことができるようにしたい場合、またはfor
ループのループが奇妙に好きな場合は、これらを使用してくださいforeach
。リンクリストで必要となるような順序でそれらにアクセスする必要はありません。このADTは重複を許可します。
ご注意ください!リストはBryanDが彼の回答で述べたように順序付けられていますが、コマンドによる順序を指定しない限り、HQLクエリを実行するときにデータベースから期待される順序でなければならないということはまったくありません。これが理由で、代わりにセットまたはバッグを使用することを好む人もいます。そのため、注文されたように見えません。私はこれを言いますが、NHibernateが実行するクエリで見つかった順にリストに追加されるため、ほとんどの場合、それらは目に見える順序で表示されます。
セットはデフォルトでは順序付けされておらず、インデックスを介して変数に直接アクセスすることはできません。セットは、デフォルトで、オブジェクトの一意性を維持する上記3つのうちの唯一のADTです。重複を含めないようにする必要がある場合は、コレクションがある場合に最適です。
バッグ(またはマルチセット)は、上記のリンクからわかるように、セット内のオブジェクトを他のオブジェクトの複製にできるタイプのセットです。リストの順序は無視できるため、通常は使用されず、バッグとして扱われます。
これらがNHibernateでどのように使用されるかに関しては、ここで選択するADTに応じてデータベースから何も引き出されません。それは、別のADTを選択させるために使用するものです。
個人的には、子オブジェクトは一意である必要があり、順序付けは問題ではないため、ほとんどの場合にセットを使用します。私は、たとえば時間など、何かで順序付けしたいオブジェクトのグループがあるリストを使用しますが、この順序を達成するには、HQLクエリで「order by」を手動で設定する必要があります。
ISet
代わりに通常だけを使用することはできませんIesi
か?