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% 有效,但是您应该能够使用反射来获取属性并创建一个可以急切加载属性的表达式。

首先,通过反射获取属性:

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

然后,创建一个指向 Man 的表达式参数和一个获取属性的表达式:

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 回答