我正在使用使用 Linq-To-SQL 类备份的 ODS(ObjectDataSource) 来填充页面上的 Gridview。
考虑到性能 - 我禁用了 Gridview 的 Viewstate 并在 ODS 中启用了缓存。
除此之外,我还优化了 Linq-to-SQL 类中的 Search 方法,以使用 .skip 和 .take 方法仅获取“一页”记录。
现在的问题是,由于缓存,ODS 无法自行对记录集进行“排序”。正如该线程的详细描述:
当我在自定义分页和排序中启用缓存时,GridView 排序不起作用
人们建议使用自定义排序并实现“比较器”,但我相信这会破坏我的性能优势。
http://forums.asp.net/t/1344883.aspx
我已准备好在排序时进行数据库旅行,但是当缓存打开时如何将其分离?
仅供参考,我已经有一个 AJAX 更新面板,其中有 Gridview (EnableViewstate = false) 和 ODS (EnableCaching=true)。希望我走在正确的道路上...建议值得赞赏。
我必须使用“自定义排序”在应用程序端执行排序(即添加额外的方法以启用对通用对象集合的排序)。这个解决方案是不可接受的,因为它要求我从数据库中提取所有记录,然后对它们进行排序!
首先,我不相信应用程序可以比数据库做更好/更快的排序。其次 - 这破坏了我因优化分页而获得的整体性能优势 - 我使用 .skip() 和 .take() LINQ 方法仅获取“一页”记录。
好吧,最后我不得不发明一个解决方案
我自己的。可能仅限于我的同类
场景但肯定是很多
更容易并且还保留了
两个分页的优化为
以及数据缓存。
我的解决方案:我点击了 Gridview 的“排序”事件。如果我允许 ODS 尝试自行对缓存数据进行排序,则会触发“自定义排序”错误。相反,现在我手动执行排序并取消排序事件。为此,我只需在 ODS 中显式设置“orderBy”参数,并将其设置为 Gridview 的“排序”事件中的新排序表达式。这将刷新网格,最后我会执行以下操作:
odsOrganization.SelectParameters["orderBy"].DefaultValue = GetSortExpr(e.SortExpression);
...
e.Cancel = true;
this tells the ODS to cancel sorting
(which I already performed before
canceling the event - as above). ITs
like I'm cheating the ODS and handling
the sorting in background. And thanks
to ODS that it senses that the
'SelectParameters["orderBy"]' has
changed and performs a select once
again. I The previous sort
automatically gets stored in the
'odsOrganization.SelectParameters["orderBy"].DefaultValue'
which I can use in sub-sequent
iterations.
我仍在测试这个,但令人惊讶的是,只需更新参数的 DefaultValue ODS 就会返回来获取数据。这会保留缓存,直到用户执行排序(它从缓存中获取数据以进行其他操作)并返回到数据库进行排序。希望它对我有用!