2009-05-06 3 views
44

Есть ли способ установить fetchmode для более чем одного объекта, используя linq для nhibernate. Кажется, существует метод расширения, который позволяет мне только установить один объект. Однако мне нужно установить его для нескольких объектов. Это возможно? СпасибоLinq for NHibernate и режим выборки с нетерпением загрузки

ответ

18

просто используйте его более одного раза.

IList<Entity> GetDataFromDatabase() 
{ 
    var query = session.Linq<Entity>(); 
    query.Expand("Property1"); 
    query.Expand("Property2"); 
    return query.ToList(); 
} 
+6

или query.Expand ("Property1, Property2"); – Sprintstar

+2

Это метод расширения? Не удается найти его в NHibernate.Linq v2.0.50727. –

+0

Я имею в виду, версия 1.0.0.0 –

8

Насколько я могу видеть, это не эквивалентно: SetFetchMode гидратов в объекты дерева и Expand метод возвращает декартово произведение.

102

Новый провайдер Linq делает это немного по-другому:

var customers = session.Query<Customer>().Fetch(c => c.Orders).ToList(); 

Подробнее здесь: http://mikehadlow.blogspot.com/2010/08/nhibernate-linq-eager-fetching.html

+0

, если 'Orders' имеет собственный подкласс, будет ли он загружен с нетерпением? если нет - как бы вы изменили запрос, чтобы загрузить его? – ilans

+1

Чтобы получить внуков: 'var customers = session.Query () .FetchMany (c => c.Orders) .ThenFetchMany (o => o.OrderLines) .ToList();' – ilans

0

В contiune к @Mike Hadlow ответ, выборка следующего уровня (внуки) вам нужно сделать:

var customers = session.Query<Customer>() .FetchMany(c => c.Orders) .ThenFetchMany(o => o.OrderLines).ToList();

Смежные вопросы