1

Я просмотрел переполнение стека и не могу найти ответ для этого где угодно.Fluent Nhibernate: Яркая загрузка частных коллекций

Скажем, у меня есть класс Man

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, критерии, QueryOver, Linq)? – cremor

+0

Я использую linq. –

ответ

3

Я только что вкратце протестировал это и не могу подтвердить, что он работает на 100%, но вы должны иметь возможность использовать отражение, чтобы получить свойство, и создать выражение, которое захочет загрузить свойство.

Во-первых, получить имущество путем отражения:

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