从SQL填充的Ajax自动完成扩展器

时间:2020-03-06 14:45:06  来源:igfitidea点击:

好的,首先让我声明我从未使用过此控件,这也是我第一次尝试使用Web服务。

我的困境如下。我需要查询数据库以获取特定的列,并将其用于自动完成。显然,我不希望用户每次在文本框中键入另一个单词时都运行查询,所以我最好的猜测是运行查询一次,然后使用该数据集,数组,列表或者其他任何东西来过滤自动填充扩展器。 。

我有点失去建议了吗??

解决方案

这个问题取决于数据存储的事务性。显然,如果我们要查找美国州(在应用程序的整个生命周期内不会实际发生变化的数据收集),那么我或者缓存System.Collection.Generic List <>类型,或者如果我们想要一个DataTable。

我们可以轻松地设置要查询的数据的缓存,使其依赖于XML文件或者数据库,以便扩展程序始终查询从缓存投射的数据对象,并且仅在数据源发生更改时才更新缓存对象。

为什么不在会话变量中跟踪用户执行的查询,然后使用它来过滤其他结果呢?

我认为防止数据库过载的技巧实际上是限制自动更新程序的更新频率,例如每2秒更新一次对我来说似乎很合理。

我要做的是:存储查询词A服务器端返回的当前列表,并将其绑定到会话变量。这基本上应该是我认为的整个列表。然后,对于输入的每个新单词,只要存在原始单词A,就可以过滤会话信息并吐出过滤后的结果,而无需再次查询。因此,基本上,仅当单词A更改时才再次查询。

我使用的是PHP的"会话",我们可能使用的是具有不同术语的不同语言,但是概念应该相同。

RAM便宜,SQL比IIS难扩展,因此将所有内容都缓存在内存中:

  • 整个数据源如果不是太大而无法在合理的时间内加载,
  • 预先计算的数据
  • 自动完成网络服务响应。

根据自动完成所需的行为和性能,我们可能需要预先计算数据并创建针对读取而优化的冗余结构。利用诸如SortedList之类的结构(当我们需要诸如"选择顶部x ...,其中z如@query +'%')之类的东西时),哈希表,...

虽然缓存所有内容当然是个好主意,但是我们关于使用哪种数据结构的问题在这里并未得到完全回答。
自动完成扩展程序的最佳数据结构是Trie。
我们可以在此处找到出色的.NET文章和代码。