如果我有一个返回AsEnumerable的函数,它是否缓存所有结果?

本文关键字:缓存 是否 结果 有一个 返回 AsEnumerable 函数 如果 | 更新日期: 2023-09-27 18:01:21

假设我有一个如下方法:

public IEnumerable<T> GETEVERYTHING()
{
     return _db.AsEnumerable();
}

然后在我的代码中调用方法

GETEVERYTHING().Where(w => w.Active == true);

它是从数据库获取所有内容,缓存它,然后过滤结果还是在调用数据库之前过滤结果?例如:它会调用数据库中的SELECT * FROM table还是SELECT * FROM table WHERE Active = 1 ?

很抱歉我的英语不好,任何帮助都将是感激的。

如果我有一个返回AsEnumerable的函数,它是否缓存所有结果?

呼叫

return _db.AsEnumerable();

没有真正执行查询,因为它是IQueryable,继承了IEnumerable,所以什么也没发生。然而,调用.ToList()将强制执行,如果有帮助的话

编辑:正如在注释中指出的那样,在大多数情况下,调用where方法本身不应该强制执行。

AsEnumerable是将linq(将由查询提供程序传递)和linq(将作为委托执行)分开的标记。如果你写db.Where(w=>w.IsActive==true).AsEnumerable().Where(w=>w.IGood==true),查询的第一部分将被转移到SQL代码:

select * from dbs where IsActive =1

但第二部分(.Where(w=>w.IGood==true))将在c#代码中作为委托执行,当您调用ToArray(), ToList()或迭代foreach时。