我有一个ListView控件,我曾经使用ASP ObjectDataSource控件填充它。这很好。
但是,我想实现一个过滤器,它显示ListView中以字母A,B,C等开头的项目。为此,我删除了ObjectDataSource控件并将其替换为Page_Load事件允许的一些代码我可以更好地控制我作为数据源传入的内容,类似于:
System.Diagnostics.Debug.Print("{0:HH:mm:ss} : GET DATA", DateTime.Now);
List<MyItem> items = GetItems("A"); // Gets a list of items with a description that
// begins with A
MyListView.Datasource = items;
System.Diagnostics.Debug.Print("{0:HH:mm:ss} : BIND DATA", DateTime.Now);
MyListView.DataBind();
System.Diagnostics.Debug.Print("{0:HH:mm:ss} : DONE", DateTime.Now);
输出(时间代表实际结果):
16:00:00 : GET DATA
16:00:00 : BIND DATA
16:00:20 : DONE
由于这样做,在浏览器中加载页面大约需要20秒,而在使用ObjectDataSource时大约需要1秒。
要将数据加载到ListView行中,我使用标准<%# Eval("Description") %>
方法。在对SO和Google进行一些搜索后,some people似乎表示Eval
效率低下。
为什么Page_Load事件中的手动绑定会降低所有内容?是因为Eval效率低下吗?如何加快速度,以及正确的方法是什么?
答案 0 :(得分:2)
似乎我不太可能认为问题是Eval语句或者你在页面加载中进行数据绑定的事实,除非你返回一个非常大的列表。 Eval可能较慢,但不是您看到的数量。可能还有另一个原因。
我会仔细检查GetItems()函数。选择代码更有可能效率低于预期。
要检查的其他事项......
检查Eval正在调用的属性。他们是否做了更多只返回字符串的事情? Eval将运行这些属性/方法中的任何代码,因此请确保它们尽可能快。
答案 1 :(得分:0)
您的数据库中有多少条记录?你有启用分页吗?如果是这样,问题可能是ObjectDataSource使用更有效的方法来仅检索它打算显示的对象的数量,而对GetItems()的调用则返回所有内容,即使它没有显示。鉴于返回时间的巨大差异,这是我对正在发生的事情的猜测。
如果发生了这种情况,可以通过限制返回的记录数来加快速度。这将取决于您对GetItems()的实现。你想写一些像GetItemsPaged(int firstRecord,int pageLength)那样只返回有限数量的数据。