2010-08-09 3 views
1

Позвольте мне объяснить проблему - надеюсь, я правильно определил ее в названии, но я хочу быть уверенным.NHibernate - динамически определять динамическую стратегию

У меня есть запрос linq, который отбрасывает кучу объектов (скажем, Foos). Каждый Foo содержит ссылку на пользователя. Каждый пользователь имеет ссылку на лицо:

public class Foo 
{ 
    //properties omitted... 
    public User CreatedBy {get;} 
} 
public class User 
{ 
    //properties omitted... 
    public Person Person {get;set;} 
} 

Поскольку структура объекта хотел бы предложить, в базе данных, Foo относится много-к-одному пользователю, и пользователь имеет отношение многих к одному человеку.

Когда я запускаю запрос, я получаю один SELECT для Foos, а затем SELECT для всех пользователей и пользователей. Ясно, что я бы предпочел один SELECT с несколькими объединениями.

Не обязательно указывать в моей конфигурации сопоставления, что FooS ВСЕГДА хочет получить пользователя или что пользователи ВСЕГДА хотят получить Человека, но я хотел бы указать, что в этом случае.

Есть ли способ сделать это?

Благодаря

Дэвид

+0

Что означает: «укажите, что в этом случае»? –

ответ

3

Все методы запроса NHibernate имеют способы указания желаемой выборки.

Для Критерии, у вас есть SetFetchMode.

Для HQL у вас есть [inner|left] join fetch.

Для Linq лет имеют Expand (2.x вно)/Fetch (3.x).

Для SQL У вас есть AddJoin.

+0

Спасибо. Это Линк, которого я хочу. Является ли эта новая версия Linq для NHibernate доступной сейчас? Я ничего не могу с этим поделать. – David

+0

http://sourceforge.net/projects/nhibernate/files/NHibernate/3.0.0Alpha1/NHibernate-3.0.0.Alpha1-bin.zip/download –

+0

Это альфа? Я мог бы просто оставить его немного позже ... – David

0

Оба Udi Dahan и Ritesh Rao предлагают пример реализации динамических стратегий кокетливыми для NHibernate, это должно дать вам хорошую отправную точку.

0

Кроме Диего хороший ответ: вы также можете использовать дозирование. Это сводит задачу N + 1 без сильной боли:

использование пакетного размера на уровне класса:

<class name="Person" batch-size="20"> 
... 
</class> 

использование пакетного размера на уровне коллекции:

<map 
    name="SomeCollection" 
    batch-size="20"> 
    ... 
</map> 

Когда-либо одной из них ссылки загружаются, NHibernate загружает 20 сразу, используя такой запрос:

select ... from Person where user_fk in (23, 34, 6, 667, 6745, 234 ....) 

Таким образом, он превращается в N+1 - N/20 + 1, что довольно хорошо.

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