5

NHibernate のエンティティ クラスの子オブジェクトのコレクションにIListIEnumerableISetまたはを使用することの違いは何ですか? ICollectionすなわち:

public class Parent
{
    public virtual int IdParent { set; get; }

    public virtual IList<Child> Children { set; get; }
    // Or
    public virtual ISet<Child> Children { set; get; }
    // Or so on...
}
4

2 に答える 2

14

IList

  • 双方向関係:サポートされていません。(子要素が感知できない子の順序を維持するために導入される追加のインデックス列があるため)
  • 注文済み : はい
  • タイプ: IList
  • 重複 : 許可
  • 要素の追加時: コレクション全体がロードされ、インデックス列の値が取得されます。子のリストが膨大な場合は避けてください。

バッグ

  • 双方向関係:サポート
  • 注文済み : いいえ
  • タイプ: IList
  • 重複 : 許可
  • 要素の追加時: データベースへのヒットは 1 つだけです。パフォーマンスの問題はありません。

I セット

  • 双方向関係:サポート
  • 注文済み : いいえ
  • タイプ:ISet(NHibernate 3.0まではインターフェースをサポートしていましたIesi.Collections
  • 重複:許可されていません
  • 要素の追加時: 重複をチェックするためにコレクション全体が読み込まれます。子のリストが膨大な場合は避けてください。

ICollection は、3 つの NHibernate マッピングのいずれかによってマップできる子コレクションの型として使用できます。

Nhibernate Cookbook 3.0 には、各コレクションの使用法が適切に説明されています。

于 2013-07-10T04:36:54.080 に答える
1

Any IEnumerable は遅延実行を意味するため、取得が下流でさらに処理される場合にクエリでこれを使用する必要があります (フィルタリングが最も明白なシナリオです)。

そうではなく、実際にコレクションを複数回列挙しないようにしたい場合は、コレクションを IList、ISet、または ICollection として使用できるようにします。コレクションに重複があることを確認したい場合は IList が優先されますが、セットに重複がないことを確認したい場合は ISet が優先されます (私の経験では、セットの動作の方が便利です)。

IList と ISetどちらもICollection であり、Count などの基本的なコレクション動作を公開します。NHib のコンテキストでは、これは .net HashSet の代わりに Iesi コレクションが使用されている実装で見られるかもしれませんが、それはおそらく、かつては .net HashSet がなく、その後 NHib の機能に遅れがあったという事実と関係があります。簡単に使用できます (ただし、NHibICollection を Iesi セットにマップできます)。

HTH

于 2013-07-10T00:17:27.730 に答える