给定以下LINQ to SQL查询:

var test = from i in Imports
           where i.IsActive
           select i;

解释后的SQL语句为:
SELECT [t0].[id] AS [Id] .... FROM [Imports] AS [t0] WHERE [t0].[isActive] = 1

说我想在选择中执行一些无法转换为SQL的操作。我的理解是,完成此操作的常规方法是执行AsEnumerable(),从而将其转换为可工作的对象。

鉴于此更新的代码:
var test = from i in Imports.AsEnumerable()
           where i.IsActive
           select new
           {
               // Make some method call
           };

并更新了SQL:
SELECT [t0].[id] AS [Id] ... FROM [Imports] AS [t0]

请注意,在执行的SQL语句中缺少where子句。

这是否意味着将整个“导入”表缓存到内存中?
如果表包含大量记录,这种性能会降低吗?

帮助我了解这里幕后的实际情况。

最佳答案

AsEnumerable的原因是



因此,当您之前调用Where方法时,您所调用的是与Where不同的IEnumerable.Where方法。该Where语句是供LINQ转换为SQL的,新的WhereIEnumerable,它接受一个IEnumerable,对其进行枚举并产生匹配项。这就解释了为什么您看到正在生成不同的SQL。在将Where扩展名应用于第二版代码之前,将从数据库中完整获取该表。这可能会造成严重的瓶颈,因为整个表必须存储在内存中,或者更糟的是,整个表必须在服务器之间移动。允许SQL Server执行Where并执行其最佳操作。

09-15 16:30