0

編集: とにかくタグがそれを示唆している可能性があるにもかかわらず、私は Fluent NHibernate を使用していると言うのを忘れていました。

私はこれらのエンティティクラスを持っています:

class OuterLevel
{
    ICollection<MidLevel> mid_items;

    ... other properties
}

class MidLevel
{
    OuterLevel parent;
    Inner1 inner1;
    Inner2 inner2;

    ... other properties
}

class Inner1
{
    int id;
    string description;
}

class Inner2
{
    int id;
    string description;
}

すべての子が適切に設定された OuterLevel オブジェクトのリストを返す Linq クエリを作成する必要があります。すべてのマッピングが正しく機能していると仮定すると、ここで見つけた難しい部分は、結果のクエリが次のようになることです。

SELECT * FROM OuterLevelTable OLT INNER JOIN MidLevelTable MLT ON (MLT.parentID = OLT.ID) INNER JOIN
    Inner1Table ON (MLT.Inner1ID = Inner1Table.ID) INNER JOIN
    Inner2Table ON (MLT.Inner2ID = Inner2Table.ID)
 WHERE (Inner1Table.someproperty1 = somevalue1) AND (Inner2Table.someproperty2 = somevalue2)

主な問題は、2 つの結合が MidLevel オブジェクトから階層の下方に開始されることです。そのため、次のように、結果のクエリが MidLevelTable の 2 回結合することなく、どの Fetch と FetchMany の組み合わせを使用できるかを判断できません。

  return All().FetchMany(x => x.mid_items).ThenFetch(x => x.inner1).FetchMany(x => x.mid_items).ThenFetch(x => x.inner2);

さらにフィルタリングできる IQueryable を返したいので、Query と QueryOver は避けたいと思います。

前もってありがとう、マリオ

4

1 に答える 1

0

結合されたテーブルをフィルタリングすると、結果のレコードがコレクションに入力するのに十分でないため、必要なことは不可能です。クエリを 1 か所で作成してさらに調整するか、コレクションのバッチ サイズを設定して SELECT N+1 を取得することをお勧めします。

于 2012-08-14T06:11:34.397 に答える