假设我有以下方法。
public IEnumerable<T> GETEVERYTHING()
{
return _db.AsEnumerable();
}
然后我在我的代码中调用该方法
GETEVERYTHING().Where(w => w.Active == true);
它是从数据库获取所有内容,缓存它还是过滤结果,还是在调用数据库之前过滤结果。例如:它会在数据库中调用SELECT * FROM table
还是SELECT * FROM table WHERE Active = 1
?
抱歉英语不好,我们将不胜感激。
答案 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#代码中的委托执行。