BreezeJS:通过executequery()== System.OutOfMemoryException检索大量记录

时间:2013-12-11 00:49:56

标签: .net entity-framework breeze entity-framework-6

当从executequery()调用返回大量(例如超过625,000)条记录时,是否需要System.OutOfMemoryException?

使用take()可以正常工作,例如

var query = breeze.EntityQuery
    .from("Biography")
    .select("ENTITY_ID, NAME, NICKNAME")
    .where("VAL1","==","AL")
    .orderBy("ENTITY_ID")
    .take(1000);

但是,要求所有记录会导致System.OutOfMemoryException错误。

var query = breeze.EntityQuery
    .from("Biography")
    .select("ENTITY_ID, NAME, NICKNAME")
    .where("VAL1","==","AL")
    .orderBy("ENTITY_ID");

运行等效的SQL大约需要5秒才能成功完成。

1 个答案:

答案 0 :(得分:1)

我并不感到惊讶。

为了清楚起见,您正在尝试通过线路移动超过625,000条记录,然后从中创建实体。服务器上的查询可能非常快,但是这些记录中的每一个都需要序列化为json,通过线路发送,然后重新构建为实体。即使具有最佳实现,这些操作既耗时又耗费大量数据。

因此,您有一些选项可以减少内存占用和操作所需的时间。

  1. 使用take(根据您的示例)
  2. 使用 EntityQuery.noTracking 选项。这跳过了将序列化记录转换为“真实”实体的步骤。如果以后需要'true'实体,可以根据需要有选择地将它们添加到EntityManager中。