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

时间:2010-02-12 21:32:54

标签: optimization sorting caching pagination objectdatasource

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

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

除此之外,我还优化了Linq-to-SQL类中的Search方法,以使用.skip& amp; .take方法只获取“有页面”的记录。


现在,问题是由于缓存,ODS无法自行“排序”记录集。详情如下:

  

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

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

  

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

我准备在排序时进行数据库操作,但是如何在启用缓存时将其分开?

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


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

首先,我不相信应用程序可以做更好/更快的排序然后DB。其次 - 由于优化的分页,这会破坏我获得的整体性能优势 - 我使用.skip()和.take()LINQ方法来仅获取“页面”记录。

  

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

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

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

    这告诉ODS取消排序   (我以前做过的   取消活动 - 如上所述)。它的   就像我在欺骗ODS和处理   在背景中排序。谢谢   到ODS,它感觉到了   'SelectParameters [“orderBy”]'有   更改并执行一次选择   再次。我以前的那种   自动存储在   'odsOrganization.SelectParameters [ “ORDERBY”]。默认值'   我可以在后续使用   迭代。

我还在测试这个,但它的惊人之处在于只需通过更新参数的DefaultValue ODS返回来获取数据。这将保留缓存,直到用户执行排序(它从缓存中获取其他操作的数据)并返回到数据库进行排序。希望它能为我工作!