我可以从这个linq查询中获得更好的性能吗?

时间:2014-07-02 16:42:05

标签: vb.net linq

我有一个表单,当我加载时,我填充开放发票(85,000+条记录)。用户可以选择“已关闭”的发票,我将我的daysOld组合框默认为60.(这允许我执行后台任务,检索过去60天内的所有已关闭发票(100,000多条记录)。然后,用户可以从下拉列表中选择60, 120, 360, 540, 720。如果用户选择720,我将重新运行查询并返回最近720天(320万条记录)的所有已结算发票。但是,如果用户选择这些较高天数之一,然后重新选择较小的一天(例如60)我不想重新运行查询,我想从我已有的记录集中提取我需要的数据。

_taClosed是我根据所选天数返回的(对象)列表。

Dim tot = (From tak In _taClosed
          Where tak.DateOfInvoice > DateTime.Now.AddDays(-1 * cmbDaysOld.SelectedItem)).CopyToDataTable()

请注意,运行linq查询需要5秒钟,这似乎很长一段时间。任何有关提高性能的建议都非常感谢。

2 个答案:

答案 0 :(得分:3)

我唯一看到的是DateTime.Now.AddDays()在lambda表达式中调用。在输入查询之前,您应该只计算一次:

Dim dateFrom = DateTime.Now.AddDays(-1 * cmbDaysOld.SelectedItem)
Dim tot = (From tak In _taClosed
          Where tak.DateOfInvoice > dateFrom).CopyToDataTable()

但我认为这不会产生太大影响。

有了这么多记录,你应该考虑使用数据库而不是内存中的集合。

另外,您是否一次显示所有项目?当你只显示几个时(由于分页),检索所有记录是没有意义的。

答案 1 :(得分:1)

有320万条记录,我怀疑原始数据存储在搜索内存中的linq查询时会更快。

我会问你为什么要把这么多原始数据加载到第一个视图中。用户无法通读这么多数据的实用方法。

可以更好地编写您的查询以加载数据的聚合视图并将其呈现给用户。