EF AsEnumerable 之后 - 查询中的所有条目是否都加载到内存中?

问题描述 投票:0回答:1

如果我在实体框架中有这样的代码

var data = query.AsEnumerable().Where(x => IsObjectValid(x)).ToList()
其中 query 是可以转换为 SQL 的 IQueryable。

实体框架是否会加载内存中数据库中的所有条目(就像 ToList() 所做的那样),然后应用 IsObjectValid() 函数并过滤数据。 或者实体框架将从数据库中一个接一个加载条目并应用过滤功能?

如果我查询中有 1000 个条目,每个条目的大小为 1 MB,那么 ToList().Where() 和 AsEnumerable().Where() 的内存使用情况是否相同?

在我的测试中 .AsEnumerable() 工作得更快并且消耗的内存更少。

谢谢!

c# asp.net entity-framework entity-framework-6
1个回答
0
投票

.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()

© www.soinside.com 2019 - 2024. All rights reserved.