我们有一个具有二进制列的数据库表。每行存储文件的文件内容。除非必要,否则我们希望避免将文件内容(每个文件的大小可以为10-20Mb)加载到应用服务器的内存中。
在以下查询中,文件内容是否将加载到应用服务器的内存中?如果是,在哪个函数调用期间?
// Query 1
dataContext.DataFiles.OrderBy(w => w.atimestamp).ToList();
// Query 2
var filesizes = from DataFiles in dataContext.DataFiles
select DataFiles.FileContent.Length;
最佳答案
返回IEnumerable<TSource>
或IQueriable<TSource>
的Linq方法被实现为延迟执行。
执行不同,只有当您调用ToList()
/ ToArray()
(或不返回诸如Sum()
/ Max()
/ FirstOrDefault()
等的集合的linq扩展方法之一)时,才会实际执行并执行检索数据
在您的第一个查询中,直到尝试检索特定项目或调用OrderBy()
为止,ToList()
尚未执行。但是,即使推迟执行该操作,在您请求第一个项目的那一刻,它也必须消耗整个集合(例如,Select()
将继续推迟整个集合的使用-see this有关更多详细信息)
在第二行查询中,在该行之后,什么都不会执行。
您可以阅读有关linq和延迟执行的MSDN blog信息,以及昨天的this question,还询问linq和延迟什么时间的问题
关于c# - 何时将数据加载到应用服务器的内存中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39031405/