EntityFramework - Sum()导致OutOfMemoryException

时间:2014-08-04 15:34:29

标签: c# sql sql-server entity-framework

我有一个MVC应用程序,它使用EntityFramework连接到MS SQL Server 2012.我正在尝试检索存储在Documents表中的所有文档的总文件大小。

我使用以下代码:

this.Documents.Sum(x => x.FileSize);

文档的类型为EntityCollection<Document>。该操作需要1.6分钟才能完成,此时它会崩溃

Exception of type 'System.OutOfMemoryException' was thrown.

这肯定与执行SELECT SUM(FileSize) FROM Documents相同,只需几毫秒即可完成,直接通过SQL Server Management Studio执行。

对于它的价值,总大小是816mb,包括1,661个文档,所以它并不是很大。

3 个答案:

答案 0 :(得分:1)

我觉得EntityCollection<Document>懒惰地加载数据库中的每个Document。如果您的Document实体具有可解释所有内容的blob数据。假设你有一个DbContext的实例,我会检索一个DbSet<Document>的实例,这样你就可以这样写:

var result = (from d in documents
              select new { Size = d.FileSize }).Sum(x => x.Size);

答案 1 :(得分:0)

如果您要对数据库执行Sum()查询,请确保您的Documents媒体资源属于IQueryable<Document>而不是IEnumerable<Document>。前者将您的LINQ查询转换为SQL(即它将被转换为SELECT SUM(FileSize)),而后者将是LINQ到对象,这将在内存中完成。

您可以参考此答案以获取更多信息:Returning IEnumerable<T> vs. IQueryable<T>

答案 2 :(得分:0)

问题似乎是由延迟加载引起的,如前面的答案所述,但是没有一种建议的方法似乎有效。但是,创建一个新的数据库实体并直接查询似乎可以正常工作:

MyEntities entities = new MyEntities();
decimal size = entities.Documents.Where(x => x.UniverseID == this.ID).Sum(x => x.FileSize);

我不确定区别是什么,但似乎有效!