我们有一个包含二进制列的数据库表。每行存储一个文件的文件内容。除非必要,否则我们希望避免将文件内容(每个文件的大小可能为 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>
的 Linq 方法或 IQueriable<TSource>
被实现为延迟执行。
差异执行,只有当你调用ToList()
/ToArray()
(或不返回集合的 linq 扩展方法之一,如 Sum()
/Max()
/FirstOrDefault()
等)将实际执行并检索数据
在您的第一个查询中,OrderBy()
在您尝试检索特定项目或调用 ToList()
之前尚未执行.但是,即使这是延迟执行的,它也必须在您请求第一项时消耗整个集合(例如 Select()
将继续延迟整个集合 - see this 了解更多详细信息)
在你的第二个查询中,在该行之后,还没有执行任何内容。
你可以阅读这个 MSDN blog关于 linq 和延迟执行以及 this question从昨天开始还问了linq和deferred什么时候的问题
关于c# - 数据何时加载到应用服务器的内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39031405/