使用具有 EnableCaching = true 的 ObjectDataSource 优化分页和排序

Posted

技术标签:

【中文标题】使用具有 EnableCaching = true 的 ObjectDataSource 优化分页和排序【英文标题】:Optimize Pagination & Sorting with ObjectDataSource having EnableCaching = true 【发布时间】:2011-01-16 08:24:40 【问题描述】:

我正在使用带有 Linq-To-SQL 类的 ODS(ObjectDataSource) 备份来填充页面上的 Gridview。

考虑到性能 - 我已禁用 Gridview 的 Viewstate 并在 ODS 中启用缓存。

除此之外,我还优化了 Linq-to-SQL 类中的 Search 方法,以使用 .skip 和 .take 方法仅获取“一页”记录。


现在,问题是由于缓存,ODS 无法自行“排序”记录集。如该线程所述:

GridView sorting doesn't work when I Enable Caching in Custome Paging and sorting

人们建议使用自定义排序并实施“比较器”,但我相信这会破坏我的性能优势。

http://forums.asp.net/t/1344883.aspx

我已经准备好在排序时进行一次 DB-trip,但是当缓存打开时如何将其分开?

仅供参考,我已经有一个 AJAX 更新面板,其中有这个 Gridview (EnableViewstate = false) 和 ODS (EnableCaching=true)。希望我走在正确的道路上......我们非常感谢您的建议。


我必须使用“自定义排序”在应用程序端执行排序(即添加额外的方法来启用对通用对象集合的排序)。这个解决方案是不可接受的,因为它要求我从数据库中提取所有记录,然后对它们进行排序!

首先,我不相信应用程序可以比 DB 进行更好/更快的排序。其次 - 这破坏了我因优化分页而获得的整个性能优势 - 我正在使用 .skip() 和 .take() LINQ 方法来仅获取“一页”记录。

好吧,最后我不得不发明一个解决方案 我自己的。它可能仅限于我的种类 的场景,但可以肯定的是它的很多 更容易,也保留了 优化两个分页为 以及数据缓存。

我的解决方案: 我点击了 Gridview 的“排序”事件。如果我允许 ODS 尝试自行对缓存数据进行排序,则会触发“自定义排序”错误。取而代之的是,现在我手动执行排序并取消排序事件。 为此 - 我只需在 ODS 中明确“orderBy”参数并将其设置为 Gridview 的“排序”事件中的新排序表达式。这将刷新网格,最后我会这样做:

odsOrganization.SelectParameters["orderBy"].DefaultValue = GetSortExpr(e.SortExpression);
...
e.Cancel = true;

这告诉 ODS 取消排序 (我之前已经表演过 取消事件 - 如上所述)。它的 就像我在欺骗 ODS 和处理 在后台排序。谢谢 到 ODS,它感觉到 'SelectParameters["orderBy"]' 有 更改并执行一次选择 再次。 I 上一个排序 自动存储在 'odsOrganization.SelectParameters["orderBy"].DefaultValue' 我可以在后续使用 迭代。

我仍在测试这个,但令人惊讶的是,只需更新参数的 DefaultValue ODS 即可返回获取数据。这会保留缓存,直到用户执行排序(它从缓存中获取数据以进行其他操作)并返回数据库进行排序。希望它对我有用!

【问题讨论】:

【参考方案1】:

这行得通吗?

http://dotnetarchitect.wordpress.com/2009/04/07/gridview-sorting-trick-when-using-object-datasource-with-custom-objects/

【讨论】:

很好的链接,但它破坏了我的性能优势,因为它要求我获取所有数据。

以上是关于使用具有 EnableCaching = true 的 ObjectDataSource 优化分页和排序的主要内容,如果未能解决你的问题,请参考以下文章

@EnableCaching如何一键开启缓存

@EnableCaching如何一键开启缓存

springboot2.0 redis EnableCaching的配置和使用

替换Spring Boot 的EnableCaching注解

本地缓存Caffeine详解+整合SpringBoot的@EnableCaching

本地缓存Caffeine详解+整合SpringBoot的@EnableCaching