Как получить объекты нескольких уровней глубоко и широко с NHibernate? - PullRequest
2 голосов
/ 08 сентября 2011

У меня есть случай, когда мне нужно загрузить около 10 000 объектов из базы данных.Модель данных выглядит примерно так:

public class SimulationObject
{
    public Container Container {get;set;}
    public IList<ResultItem> Results {get;set;}
    public IList<PreviewData> PreviewData {get;set;}
    ...
}

public class ResultItem
{
    public IList<SomeDataItem> Items {get;set;}
    ...
}

public class PreviewData
{
    public IList<SomeDataItem> Items {get;set;}
    ...
}

Это означает, что я хочу запросить список объектов SimulationObjects из базы данных по какому-либо запросу и все его свойства (ссылки) и подпункты.

Количество коллекций следующее:

  1. SimulationObject - около 6000 - 1200, в зависимости от параметров в «где»
  2. SimulationObject.Results - от 5 до 40 элементов
  3. SimulationObject.Results.Items - от 0 до 2 элементов
  4. SimulationObject.PreviewData - от 0 до 2 элементов
  5. SimulationObject.PreviewData.Items - от 1 до 3 элементов

Как правило, я бы сделал это так:

var query = from sim in session.Query<SimulationObject>()
        where sim.Container.Id == containerId && ...
            select sim;

query = query.FetchMany(c => c.Results).ThenFetch(o => o.Items)...

Однако мне также нужно выбрать элементы «PreviewData», чтобы создать декартово произведение в моем запросе (то есть PreviewDataAndSubItemsCount xResultsAndSubItemsCount количество возвращенных строк), что очень неэффективно.Кроме того, поскольку мне нужно загрузить МНОЖЕСТВО объектов SumulationObjects (около 10000, как было сказано ранее), я не могу выполнять отложенную загрузку (10000 запросов ... и есть и другие трудности, так что это даже не альтернатива для рассмотрения).

Так, каковы альтернативы?Какую стратегию вы бы использовали для загрузки полного графа объектов в память?

Спасибо.

1 Ответ

2 голосов
/ 09 сентября 2011

Айенде объясняет один из способов сделать это здесь ( HQL ):
http://ayende.com/blog/4367/eagerly-loading-entity-associations-efficiently-with-nhibernate

Была также статья StackOverflow, с которой я столкнулся, которая делает это, используя QueryOver :
NHibernate Eager Загрузка с API Queryover для графа сложных объектов

Мне было бы очень интересно получить дополнительную информацию от остального сообщества. Я думаю, что это одна из областей, в которой NH может улучшиться.

...