LINQ-to-Object 是 LINQ 提供程序吗?

Is LINQ-to-Object is a LINQ provider?

我有些困惑,在 Linq-to-Object 中,我们使用内存中的数据来执行由 c# 语言处理的 LINQ 查询。

当我编写基于内存中数据执行的 Linq 查询时,为什么我们使用提供程序 (LINQ-to-Object)?

LINQ to Objects 不是 LINQ 提供程序。它是 LINQ API 在 IEnumerable 上的实现。只要正确命名方法并接受正确的参数,LINQ API 几乎可以在任何类型上实现。也就是说,与 LINQ to Objects 相关的 LINQ 提供程序非常接近。当源是 IQueryable 并且编译器生成表达式树时,使用提供程序。可以将表达式树编译为委托,因此 Compile 方法的作用与 LINQ 提供程序非常相似。

另请注意,在实践中 "LINQ Provider" 通常用于指示 LINQ API 的简单实现。这有点类似于 "argument" 和 "parameter" 的互换使用方式,尽管差异很小。

不,Linq to Object 不是提供者,它不必依赖任何其他中间提供者来 运行 查询(linq to object)。

为了更清楚地理解它,我们必须了解什么是提供者。 Provider 基本上是实现 IQueryProviderIQueryable 接口的实现,这主要将您的 linq 查询转换为 SOMETHING您的提供商了解。例如,当您使用 LINQ to SQL 查询时,您的查询 converted/translated 变成了 SQL,它会被翻译成 SQL,因为您的提供者(在这种情况下)只理解 SQL.

当您运行查询内存中的数据集合时,C# 不必将您的 linq 查询转换为其他查询。

正如@Stilgar 提到的“当源是 IQueryable 时使用提供者”。当您处理内存中数据时,您的源基本上是 IEnumerable。