使用大量数据

时间:2015-01-12 13:06:52

标签: c# sql database entity-framework

我将c#appliaction和entity famework作为ORM。 我得到了表Images的数据库。表格包含IdTimeStampData列。 该表可以有真正的ALOT实体。另外Data列包含大字节数组。 我需要从某个日期开始采用第一个实体,或者以前5个为例。

var result = Images.OrderBy(img => img.TimeStamp).FirstOrDefault(img => img.TimeStamp > someDate);

抛出内存不足异常。 有没有办法通过? 我应该使用存储过程还是别的什么?

1 个答案:

答案 0 :(得分:2)

如果Images已经是查询对象,那么当你OrderBy它时,它会访问整个集合。我假设它不是,它直接是您的DbSet或EF IQueryable(因此您使用Linq-To-Entities而不是Linq-To-Objects查询并且排序已完成对数据库的查询,而不是返回的整个集合。)

除非您需要更改跟踪检测功能,否则请使用AsNoTracking上的DbSet(在这种情况下为Context.Images.AsNoTracking().OrderBy(...)。这应该会大幅降低内存需求(更改跟踪检测需要更多)两倍的记忆)。

此外,如果使用大型blob数据,最好将其存储在自己的表中(只有iddata),并且仅在需要时访问它(具有如果您正在使用ORM并希望始终使用原始实体(也可以使用id项目,请参考您正在执行操作的表/实体上的此Select对没有blob字段的新实体的查询。)

如果您需要一直访问返回行的图像数据,并且系统中没有足够的内存,那么运气不错。