我有一个处理所有数据库方法的类,包括实体框架相关的东西.
当需要数据时,其他类可以调用此类中的方法,例如
当需要数据时,其他类可以调用此类中的方法,例如
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.将此设置与关闭代理创建相结合将导致不缓存实体,并且通过查询结果的迭代应始终仅加载单个实体化实体(不加载已加载实体的缓存).
在简单的情况下,您可以随时检查客户端是否询问太多记录,并且仅仅是启动异常或仅返回最大允许记录.