微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 使用Entity Framework和LINQ查询大型数据集时如何避免内存溢出

我有一个处理所有数据库方法的类,包括实体框架相关的东西.
当需要数据时,其他类可以调用此类中的方法,例如
public List<LocalDataObject> GetData(int start,int end);

数据库使用LINQ to EF进行查询,调用类可以对数据进行迭代.
但由于其他类不能访问EF中的实体,因此我需要对查询执行“ToList()”操作,并将完整的数据集提取到内存中.

如果这个集合非常大(GB的10s-100s)会发生什么情况?

是否有更有效的迭代方式,仍然保持松耦合?

解决方法

在实体框架中使用大型数据集的正确方法是:

>使用EFv4和POCO对象 – 它将允许与上层共享对象,而不引入对实体框架的依赖
关闭代理创建/延迟加载,完全从对象上下文中分离POCO实体
>公开IQueryable< EntityType>允许上层更精确地指定查询,并限制从数据库加载的记录数
>在数据访问方法显示IQueryable时,会在ObjectQuery上设置MergeOption.NoTracking.将此设置与关闭代理创建相结合将导致不缓存实体,并且通过查询结果的迭代应始终仅加载单个实体化实体(不加载已加载实体的缓存).

在简单的情况下,您可以随时检查客户端是否询问太多记录,并且仅仅是启动异常或仅返回最大允许记录.

原文地址:https://www.jb51.cc/csharp/94917.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐