У меня есть случай, когда мне нужно загрузить около 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 из базы данных по какому-либо запросу и все его свойства (ссылки) и подпункты.
Количество коллекций следующее:
- SimulationObject - около 6000 - 1200, в зависимости от параметров в «где»
- SimulationObject.Results - от 5 до 40 элементов
- SimulationObject.Results.Items - от 0 до 2 элементов
- SimulationObject.PreviewData - от 0 до 2 элементов
- 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 запросов ... и есть и другие трудности, так что это даже не альтернатива для рассмотрения).
Так, каковы альтернативы?Какую стратегию вы бы использовали для загрузки полного графа объектов в память?
Спасибо.