为什么目录通过IQueryable公开部件而不仅仅是IEnumerable。我一直在考虑它,但我不明白它们是如何(或者如果)实际使用接口提供的任何IQueryable服务。
答案 0 :(得分:4)
因为它允许实现不必扫描每个查询的所有可用部分(O(N)操作)。
举一个具体的例子,考虑以下查询,该查询可能类似于MEF在内部查找具有正确合同的导出的内容:
var matches = catalog.Parts
.Where(part => part.ExportDefinitions.Any(
export => export.ContractName == "foo"));
IQueryProvider
的目录实现可以将生成的表达式树识别为“给我输出合同的部分'foo'”,然后使用'foo'作为键从字典中检索它们,O( 1)操作 - 而不是实际枚举所有部分并执行传递给.Where
的lambda,就像IEnumerable
的情况一样。
编辑:我上面的示例并不是很好,因为已经有一个专门用于此案例的GetExports方法;没有必要像这样查询Parts
属性。也许更好的例子涉及export.Metadata
。