我正在使用一个带有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”,但我相信这会破坏我的性能优势。
我准备在排序时进行数据库操作,但是如何在启用缓存时将其分开?
仅供参考,我已经有一个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返回来获取数据。这将保留缓存,直到用户执行排序(它从缓存中获取其他操作的数据)并返回到数据库进行排序。希望它能为我工作!