如果我在实体框架中有这样的代码
var data = query.AsEnumerable().Where(x => IsObjectValid(x)).ToList()
其中 query 是可以转换为 SQL 的 IQueryable。
实体框架是否会加载内存中数据库中的所有条目(就像 ToList() 所做的那样),然后应用 IsObjectValid() 函数并过滤数据。 或者实体框架将从数据库中一个接一个加载条目并应用过滤功能?
如果我查询中有 1000 个条目,每个条目的大小为 1 MB,那么 ToList().Where() 和 AsEnumerable().Where() 的内存使用情况是否相同?
在我的测试中 .AsEnumerable() 工作得更快并且消耗的内存更少。
谢谢!
.AsEnumerable()
之前的部分将被翻译成SQL并由DB执行。从数据库加载数据后,.AsEnumerable()
之后的部分将作为 LINQ to Objects 执行。
var data = dbContext.Data
.Where(d => d.Author = "me")
.AsEnumerable()
.Where(d => MyCustomValidationFunction(d))
.ToList();
第一个
Where
将在数据库上执行,只有带有Author = "me"
的记录才会返回到您的应用程序。然后,将对此返回的数据执行第二个 Where
,并对过滤后的数据执行 ToList()
。