gpt4 book ai didi

c# - 了解 LINQ to SQL 中的 .AsEnumerable()

转载 作者:IT王子 更新时间:2023-10-29 03:54:03 26 4
gpt4 key购买 nike

给定以下 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的原因是为了

AsEnumerable(TSource)(IEnumerable(TSource)) can be used to choose between query implementations when a sequence implements IEnumerable(T) but also has a different set of public query methods available

因此,当您之前调用 Where 方法时,您调用的是与 IEnumerable.Where 不同的 Where 方法。 Where 语句用于 LINQ 转换为 SQL,新的 Where 是采用 IEnumerableIEnumerable 语句, 枚举它并产生匹配项。这解释了为什么您会看到生成不同的 SQL。在 Where 扩展将应用于您的第二个版本的代码之前,该表将从数据库中完整获取。这可能会造成严重的瓶颈,因为整个表必须在内存中,或者更糟的是整个表必须在服务器之间传输。允许 SQL 服务器执行 Where 并做它最擅长的事情。

关于c# - 了解 LINQ to SQL 中的 .AsEnumerable(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3311244/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com