我查看了堆栈溢出,无法在任何地方找到答案。
说我有一个班级人员
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()来急切加载它,但是当它被设置为受保护时,我找不到一种方法来急切加载该集合。
我还应该提一下,我希望逐个加载代码,而不是映射。
感谢。
答案 0 :(得分:3)
我只是简单地对此进行了测试,并且无法确认它是否100%正常工作,但您应该能够使用反射获取属性并创建一个表达式,该表达式会急切加载该属性。
首先,通过反思得到财产:
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();