2016-08-19 62 views
2

我们有一个有二进制列的数据库表。每行存储文件的文件内容。我们希望避免将文件内容(每个文件的大小可以是10-20Mb)加载到应用程序服务器的内存中,除非有必要。数据何时加载到应用服务器的内存中?

在以下查询中,文件内容是否会被加载到应用服务器的内存中?如果是,在哪个函数调用?

// Query 1 
dataContext.DataFiles.OrderBy(w => w.atimestamp).ToList(); 


// Query 2 
var filesizes = from DataFiles in dataContext.DataFiles 
       select DataFiles.FileContent.Length; 
+0

Q1的事 - >加载到内存中,你正在做的.ToList() Q2 - >将不会,因为这将是IQueryable Developer

回答

0

LINQ的方法,返回IEnumerable<TSource>IQueriable<TSource>被实现为被推迟执行。 被执行差别,只有当你调用ToList()/ToArray()(或LINQ的扩展方法不返回集合像Sum()/Max()/FirstOrDefault()等一个)将实际执行,将检索数据

在你第一个查询,OrderBy()尚未执行,直到您尝试检索特定项目或致电ToList()。然而,即使这是推迟执行,这个人将不得不在你请求第一个项目的那一刻消耗整个集合(例如,Select()例如将继续延迟整个集合 - see this的一些更多细节)

在你的第二个查询中,在该行之后,还没有任何内容会被执行。

您可以阅读MSDN blog大约从昨天LINQ和延迟执行和this question也askes什么时候LINQ和递延

相关问题