1

私はスタックオーバーフローを見回しましたが、これに対する答えがどこにも見つかりません。

私はクラスの男を持っていると言う

class Man
{
    protected virtual ICollection<Cat> Cats {get; set;}
}

class ManMapping : ClassMap<Man>
{
    HasMany(Reveal.Member<Man, IEnumerable<Cat>>("Cats"))
            .KeyColumn("ManId")
            .Cascade.All();
}

それがパブリック プロパティであれば、.fetch() を使用して積極的にロードできることはわかっていますが、コレクションが保護に設定されている場合にコレクションを積極的にロードする方法が見つかりません。

また、マッピングではなく、ケースバイケースでコードを熱心にロードすることを検討していることにも言及する必要があります。

ありがとう。

4

1 に答える 1

3

これを簡単にテストしただけで、まだ 100% 動作することは確認できませんが、リフレクションを使用してプロパティを取得し、プロパティを積極的にロードする Expression を作成できるはずです。

まず、リフレクションを通じてプロパティを取得します。

var catsProperty = typeof(Man).GetProperty("Cats", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

次に、Man を指す式引数と、プロパティを取得する Expression を作成します。

var expressionArgument = Expression.Parameter(typeof(Man), "m");
var propertyGetter =
    Expression.Lambda<Func<Man, IEnumerable<Cat>>>(
        Expression.Property(expressionArgument, catsProperty),
        expressionArgument);

次に、linq クエリでそれを使用します。

var man =
    session.Query<Man>()
        .Fetch(propertyGetter)
        .First();
于 2013-07-16T11:16:57.233 に答える