我将c#appliaction和entity famework
作为ORM。
我得到了表Images
的数据库。表格包含Id
,TimeStamp
,Data
列。
该表可以有真正的ALOT实体。另外Data
列包含大字节数组。
我需要从某个日期开始采用第一个实体,或者以前5个为例。
var result = Images.OrderBy(img => img.TimeStamp).FirstOrDefault(img => img.TimeStamp > someDate);
抛出内存不足异常。 有没有办法通过? 我应该使用存储过程还是别的什么?
答案 0 :(得分:2)
如果Images
已经是查询对象,那么当你OrderBy
它时,它会访问整个集合。我假设它不是,它直接是您的DbSet
或EF IQueryable
(因此您使用Linq-To-Entities而不是Linq-To-Objects查询并且排序已完成对数据库的查询,而不是返回的整个集合。)
除非您需要更改跟踪检测功能,否则请使用AsNoTracking
上的DbSet
(在这种情况下为Context.Images.AsNoTracking().OrderBy(...)
。这应该会大幅降低内存需求(更改跟踪检测需要更多)两倍的记忆)。
此外,如果使用大型blob数据,最好将其存储在自己的表中(只有id
和data
),并且仅在需要时访问它(具有如果您正在使用ORM并希望始终使用原始实体(也可以使用id
项目,请参考您正在执行操作的表/实体上的此Select
对没有blob字段的新实体的查询。)
如果您需要一直访问返回行的图像数据,并且系统中没有足够的内存,那么运气不错。