У меня есть случай, когда мне нужно загрузить около 10 000 объектов из базы данных. Модель данных что-то вроде этого:Как получить объекты нескольких уровней в глубину и ширину с помощью NHibernate?
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 - CA от 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 х ResultsAndSubItemsCount из строки возвращены), что очень неэффективно. Кроме того, поскольку мне нужно загрузить LOT of SumulationObjects (около 10000 как sayd ранее), я не могу выполнять ленивую загрузку (10000 запросов ... и есть и другие трудности, поэтому это даже не альтернатива).
Итак, каковы альтернативы? Какую стратегию вы бы использовали для загрузки графа объектов-компиляторов в память?
Спасибо.
10,000 'SimulationObject' s фирменный номер, или это возможно, что он будет расти в будущем? В среднем, сколько 'ResultItem' за' SimulationObject'? Сколько 'PreviewData' за 'SimulationObject'? Сколько 'SomeDataItem' на' PreviewData' и 'ResultItem'? Вам также нужно получить «SomeDataItem's», или эти внуки могут быть ленивыми? –
В 'SimulationObject', do' PreviewData' и 'ResultItem' делят свои' SomeDataItem''? Другими словами, если задано 'SomeDataItem x', это утверждение истинно:' x.ResultItem.SimulationObject == x.PreviewData.SimulationObject'? Если это так, то у вас есть отношения в форме бриллианта, которые влияют на то, сколько из нас нужно делать на этих объектах внука. –
Нет, они не разделяют отношения. Фактически, элементы PreviewData и элементы ResultItem хранятся в разных таблицах в db. Класс SomeDataItem был псевдокодом. О, и я добавил количества к сообщению. – user315648