Итак, я думаю, что ДОЛЖЕН быть лучшим способом делать то, что я делаю ...Как я могу значительно улучшить производительность при загрузке нескольких взаимосвязанных вещей из базы данных?
У меня в настоящее время есть 1 класс под названием «Герой». Он содержит 19 свойств (конечно, может быть изменен). Он представляет собой таблицу базы данных, в которой у меня есть информация.
Затем у меня есть другая таблица базы данных для комментариев к этим героям. Одним из свойств каждого героя является ObservableCollection, и комментарий просто содержит несколько основных свойств.
Я планирую в будущем, поскольку я создаю это, чтобы иметь другие связанные таблицы.
В ViewModel у меня есть ObservableCollection, который я инициализирую с каждым героем из моей SQLite DB.
Когда программа запускается, я прохожу следующее:
Во-первых, я запрашиваю героев таблицы и вытащить всех героев в ObservableCollection в VM. Пример:
DataTable dt = db.GetDataTable("SELECT * FROM Heroes");
foreach (DataRow Row in dt.Rows)
{
Heroes.Add(new Hero(
HID: Convert.ToInt32(Row["ID"]),
HName: Row["Name"].ToString(),
ETC.....
));
}
Тогда я точно такой же за столом Heroes_Comments - Я вытащить все оттуда, и хранить его в ObservableCollection. То же самое, что и выше, только запрос - «SELECT * FROM Heroes_Comments», а в разных полях используется ETC ofc.
Наконец, я запускаю foreach для каждого комментария в ObservableCollection и добавляю его в коллекцию Hero. Как так:
foreach (Comment c in HeroesDBComments)
{
HeroesDBHeroes.Single(h => h.ID == c.Foreign).Comments.Add(c);
}
Это все работает, и делает свою работу и т.д. ... Однако с не так много тестовых данных, это, кажется, принять справедливое время, чтобы сделать все, и я чувствую, что я добавить больше вещей к этому он полностью опустеет и станет бесполезным.
Что можно сделать, чтобы улучшить это? Я бы предпочел получить это прямо сейчас, чем улучшить и исправить все это позже. :)
(FYI - Test data в настоящее время смотрит около 10 героев и 5 комментариев, все 5 комментариев к одному герою. Каждый герой имеет 2 изображения, хранящихся в виде BLOB ... так что это не самая маленькая сумма данные когда-либо, но я чувствую, что foreach на комментариях плох, когда речь заходит о добавлении более связанных таблиц и о том же, что и в случае с ними ... Я просто не знаю, что лучше? »
Мысль: Наблюдаемые показатели медленнее и там возможно, лучшая альтернатива?
Зачем загружать все из них? Возможно, просто загрузите имена героев, а затем, когда пользователь перейдет к более подробному описанию, загрузите его для этой записи. Это действительно зависит от того, как вы показываете все это пользователю, но нет никакой причины загружать больше данных, чем может посмотреть пользователь. –
Все данные представлены в datagrid. Большинство вещей вдоль основной строки, некоторые thigns в rowdetails. Будут другие базовые классы, похожие на Hero, когда это будет завершено, все с дополнениями. Но если я не загружаюсь при запуске, то при первом обращении пользователя к странице с данными (которые будут все, что они когда-либо делали) будет загружать все, если я захочу не загружаться до тех пор, пока они им не понадобятся ... но хуже, если нажать кнопку и не видеть, чтобы что-то происходило в течение веков, а затем было больше времени загрузки при запуске. – pingu2k4
Сколько строк может видеть пользователь сразу? Вы можете просто загрузить видимые строки, а затем в фоновом режиме предварительно загрузить следующий набор видимых строк по мере прокрутки пользователя. Я не могу себе представить, что они могут видеть и интерпретировать все эти данные сразу, у вас должен быть способ для них расширить детали героя или что-то в этом роде. –