Производительность IQueryable по сравнению со словарем
-
14-11-2019 - |
Вопрос
Я кэширую целую кучу статических метаданных в своем приложении при запуске.Это из базы данных, и существует множество связей с внешними ключами.Я ищу наилучший способ их моделирования.Я только начал работать с LINQ.
Мне легко объявить класс
public class AllData {
public static IQueryable<libm_ColPurpose> IQ_libm_ColPurpose = libm_ColPurpose.All();
public static IQueryable<libm_ColType> IQ_libm_ColType = libm_ColType.All();
...
(Я использую SubSonic 3 для создания своих классов, но это к делу не относится).Тогда я могу использовать IQueryable<T
> участники могут получить доступ ко всему, что я захочу, например:
libm_ColType ct = AllData.IQ_libm_ColType.SingleOrDefault(x => x.ColTypeStr == this.DefaultJetColTypeStr);
До использования IQueryable я использовал словари для хранения отношений FK, поэтому, чтобы имитировать приведенный выше код, я бы закодировал следующее из ранее существовавшего списка<libm_ColType
> список
Dictionary<string, libm_ColType> colTypeByColTypeStr = new Dictionary<string, libm_ColType>();
foreach (libm_ColType x in list) { rtn.Add(x.ColTypeStr, x); }
и тогда я мог бы использовать
libm_ColType ct = colTypeByColTypeStr[this.DefaultJetColTypeStr];
Итак, наконец-то мы подошли к вопросу!
Поиск по словарю по идентификатору чрезвычайно эффективен, однако решение IQueryable гораздо более гибкое и элегантное.
Мне интересно, насколько сильно я увеличу производительность, используя IQueryable.Я подозреваю, что я выполняю линейное сканирование списка каждый раз, когда вызываю его, и это действительно будет увеличиваться при повторных вызовах, если задействовано много записей.Было бы здорово, если бы я мог идентифицировать столбцы с уникальным значением и сгенерировать и кэшировать хэш-таблицу после первого поиска, но я подозреваю, что это не будет частью предложения.
Для меня это своего рода препятствие в использовании LINQ.
Обратите внимание (я повторю это еще раз), что я не извлекаю данные из базы данных, они уже есть в памяти, и я запрашиваю их там, поэтому мне интересно только найти IQueryable в памяти<T
>.
Решение
IQueryable представляет собой коллекцию в хранилище данных, так что вы, вероятно, не храните коллекции в памяти.Если вам явно нужны коллекции в памяти, то я бы вернулся к вашим словарям.Помните, что это не мешает вам использовать запросы LINQ для обработки данных.