我有些困惑,在 Linq-to-Object 中,我们使用内存数据来执行由 c# 语言处理的 LINQ 查询。
当我编写基于内存数据执行的 Linq 查询时,为什么我们使用提供程序(LINQ-to-Object)?
我有些困惑,在 Linq-to-Object 中,我们使用内存数据来执行由 c# 语言处理的 LINQ 查询。
当我编写基于内存数据执行的 Linq 查询时,为什么我们使用提供程序(LINQ-to-Object)?
LINQ to Objects 不是 LINQ 提供程序。它是 IEnumerable 上的 LINQ API 的实现。只要您正确命名方法并接受正确的参数,几乎可以在任何类型上实现 LINQ API。话虽如此,与 LINQ to Objects 相关的 LINQ 提供程序非常接近。当源是 IQueryable 并且编译器生成表达式树时,将使用提供程序。表达式树可以编译为委托,因此 Compile 方法的作用与 LINQ 提供程序非常相似。
另请注意,在实践中,“LINQ 提供程序”通常用于简单地表示 LINQ API 的实现。尽管差异很小,但它有点类似于“参数”和“参数”如何互换使用。
不,Linq to Object不是提供者,它不必依赖任何其他中间提供者来运行查询(linq to object)。
为了更清楚地理解它,我们必须了解提供者实际上是什么。Provider 基本上是实现IQueryProvider和IQueryable接口的实现,这主要将您的 linq 查询转换为您的提供者可以理解的某些内容。例如,当您使用LINQ to SQL查询您的查询转换/翻译成 SQL 时,它会被翻译成 SQL,因为您的提供程序(在这种情况下)只理解 SQL。
当您对内存中的数据集合运行查询时,C# 不必将您的 linq 查询转换为其他查询。
正如@Stilgar 提到的“当源为 IQueryable 时使用提供者”。当您处理 In-Memory 数据时,您的源基本上是 IEnumerable。