Вопрос

Я кэширую целую кучу статических метаданных в своем приложении при запуске.Это из базы данных, и существует множество связей с внешними ключами.Я ищу наилучший способ их моделирования.Я только начал работать с 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 для обработки данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top