Производительность IQueryable против словаря - PullRequest
0 голосов
/ 16 мая 2011

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

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];

OK, так что, наконец, мы перейдем к вопросу!

Поиск в словаре по идентификатору чрезвычайно эффективен, однако решение IQueryable гораздо более гибкое и элегантное.

Мне интересно, какой удар по производительности я получу, используя IQueryable.Я подозреваю, что я делаю линейное сканирование списка каждый раз, когда я вызываю его, и это действительно будет складываться из-за повторных вызовов, если задействовано много записей.Было бы здорово, если бы я мог определить уникальные столбцы и создать хеш-таблицу, сгенерированную и кэшированную после первого поиска, но я подозреваю, что это не будет частью предложения.

Это немного нарушает правиладля меня относительно использования LINQ.

Обратите внимание (я повторю это снова), что я НЕ извлекаю данные из базы данных, они уже находятся в памяти, и я запрашиваю их там, так что мне интереснопри поиске в памяти IQueryable <T>.

1 Ответ

0 голосов
/ 16 мая 2011

IQueryable представляет коллекцию в хранилище данных, поэтому, вероятно, у нет коллекций в памяти.Если вам явно нужны коллекции в памяти, я бы вернулся к вашим словарям.Помните, что это не мешает вам использовать запросы LINQ к данным.

...