1

親を選択するときに、子コレクション内のすべての項目に対して個別の SQL クエリが生成されるという問題があります。

Child オブジェクトの IList コレクションを持つ Parent オブジェクトがあります。

linq を使用して次のコードを実行すると、休止状態になります。

次のようなSQLステートメントを取得します。

SELECT * FROM Parent
SELECT * FROM Child WHERE ParentId = 1
SELECT * FROM Child WHERE ParentId = 2
SELECT * FROM Child WHERE ParentId = 3
SELECT * FROM Child WHERE ParentId = 4
etc etc

これは明らかに非常に非効率的で、マッピング ファイルと関係があると思いますか?

以下は、子コレクションのマッピングです。

<bag name="Children" lazy="false" table="Child" cascade="all-delete-orphan">
  <key column="ParentId"/>
  <one-to-many class="Child" />
</bag>

これはどこかの初心者の間違いだと信じてください。

どんな助けでも大歓迎です。

S

4

2 に答える 2

0

それはすべて、 _repository.ToList() が内部で何をしているかに依存します。次のような HQL 構文を使用して、コレクションの「イーガー」フェッチを強制できます。

"from Parent inner join fetch Children"

HQL ステートメントは柔軟であることを意図しているため、流暢にまたは hbm xml ファイルで定義されたコレクション マッピングおよび結合戦略を無視する傾向があります。

データベースに対して実行された単一のクエリのみが表示されるはずです。

于 2009-09-18T13:50:16.677 に答える
0

このLinq for NHibernate を見て、熱心な読み込みのモードを取得してください。サブコレクションが常にコンテキスト内にある必要がある場合は、マッピング ファイルでフェッチ戦略を管理できます。ただし、NH のベスト プラクティスでは、これを推奨していません。代わりに、常にコレクションを遅延させ、必要に応じてクエリにフェッチ戦略を設定します。

于 2009-10-30T19:21:32.497 に答える