1

我查看了周圍的堆棧溢出,無法在任何地方找到答案。Fluent Nhibernate:急於加載私人收藏

說我有一類人

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

預加載取決於查詢類型,您使用的是哪種類型(HQL,Criteria,QueryOver, LINQ)? – cremor

+0

我正在使用linq。 –

回答

3

我只是簡單地測試了一下,並且無法確認它是否有效,但是您應該能夠使用反射來獲取屬性並創建一個可以加載屬性的表達式。

首先,打通反射屬性:

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

然後,創建一個表達式參數指向一個男人,這一點得到屬性的表達式:

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();