我有一个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个文档,所以它并不是很大。
答案 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);
我不确定区别是什么,但似乎有效!