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

时间:2015-07-07 15:26:50

标签: c# performance entity-framework ienumerable

假设我有以下方法。

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

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

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

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

抱歉英语不好,我们将不胜感激。

2 个答案:

答案 0 :(得分:2)

调用

return _db.AsEnumerable();

实际上并不是要执行查询,因为它是一个继承IEnumerable的IQueryable,所以没有任何反应。然而,调用.ToList()会强制执行,如果这有帮助的话

编辑:正如评论中所指出的那样,自己调用where方法不应强制执行MOST的时间。

答案 1 :(得分:1)

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

select * from dbs where IsActive =1

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