我正在使用 Linq2Sql 返回存储过程的结果。sproc 在 2 秒内提供 100,000 条记录。应用 ToList() 需要 2 多分钟。
该项目是一个 ASP.NET WebForm。在代码隐藏中,我试图从事务系统中获取记录,以对仪表板类型的报告应用各种分析。10 万条记录是平均一个月的数据量。使用较小的数据一切正常。
using (FooDataContext dbml = new FooDataContext())
{
var query = dbml.FooBar(OneParam, TwoParam, ThreeParam);
//no delay
var results = query.ToList();
//takes over 2 minutes -- consistent network traffic throughout
ReportGenerator.PivotTable(results);
ReportGenerator.Chart(results);
//etc.
}
我使用 ToList() 来利用 Linq 的水合 sproc 对象,这些对象对于使用 lambda 表达式评估结果非常方便。
但是 ToList() 需要非常非常长的时间来为这么多数据构建每个结果。如果我在那段时间暂停该过程,我可以看到它只是一遍又一遍地循环通过 sproc 的构造函数。查看我的网络流量似乎可以确认每个对象的代码都将返回到数据库。将 DeferredLoadingEnabled 设置为 false 没有帮助。
有趣的是,我认为存储过程的一个缺点是它们会立即将所有数据转储给您,而不是作为 IQueryable?