在LINQ to SQL中了解.AsEnumerable()
给定以下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的原因是
当序列实现IEnumerable(T)但也具有一组可用的公共查询方法时,可以使用AsEnumerable(TSource)(IEnumerable(TSource))在查询实现之间进行选择
因此,当您Where
之前调用该方法时,您所调用的是与Where
方法不同的方法IEnumerable.Where
。这Where
说法是对LINQ转换为SQL,新Where
是IEnumerable
一个接受一个IEnumerable
,列举并产生相匹配的项目。这就解释了为什么您看到正在生成不同的SQL。在将Where
扩展名应用于第二版代码之前,将从数据库中完整获取该表。这可能会造成严重的瓶颈,因为整个表必须存储在内存中,或者更糟的是,整个表必须在服务器之间移动。允许SQL
Server执行Where
并执行其最佳操作。
以上是 在LINQ to SQL中了解.AsEnumerable() 的全部内容, 来源链接: utcz.com/qa/405541.html