Поскольку он допускает реализации, которым не нужно сканировать все доступные детали (операция 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
.