Почему IQueryable используется вместо IEnumerable с каталогами MEF? - PullRequest
2 голосов
/ 04 марта 2012

Почему каталоги открывают детали через IQueryable, а не только IEnumerable.Я думал об этом, но я не понимаю, как (или если) они фактически используют какие-либо сервисы IQueryable, которые предоставляет интерфейс.

1 Ответ

4 голосов
/ 05 марта 2012

Поскольку он допускает реализации, которым не нужно сканировать все доступные детали (операция O (N)) для каждого запроса.

Чтобы привести конкретный пример, рассмотрите следующий запрос, который может быть похожимк чему-то, что MEF делает внутренне, чтобы найти экспорт с правильным контрактом:

var matches = catalog.Parts
    .Where(part => part.ExportDefinitions.Any(
        export => export.ContractName == "foo"));

Реализация каталога IQueryProvider может распознавать получающееся дерево выражений как «дай мне части, которые экспортируют контракт« foo »»а затем извлечь их из словаря, используя 'foo' в качестве ключа, операцию O (1) - вместо фактического перечисления всех частей и выполнения лямбда-выражения, переданного в .Where, как в случае IEnumerable.

edit : мой пример выше не очень хороший, потому что уже есть метод GetExports специально для этого случая;нет необходимости запрашивать свойство Parts таким образом.Возможно, лучшим примером будет export.Metadata.

...