【发布时间】:2011-05-12 15:09:06
【问题描述】:
会喜欢你对这个的想法。
我在 ASP.NET MVC 应用程序中使用 jQuery 自动完成功能从数据库中检索记录列表 - 我想知道是否有比我目前使用的方法更好的方法 - 如下:
这里是 jQuery(我正在使用自动完成调用操作方法“GetRecordByName”)
$('#tb_name').autocomplete({
source: 'Home/GetRecordByName',
minLength: 1, delay: 0,
select: function (event, ui) {
// do stuff
}
});
在后端,我在方法中使用Linq to Entities从数据库中获取结果:
public JsonResult GetRecordByName(string term)
{
var data = records
.Where(dr => dr.Key.StartsWith(term))
.Select(dr => new { dr, value = dr.Key })
.Take(5);
return Json(data, JsonRequestBehavior.AllowGet);
}
目前,它的运行速度有点慢(约 1-2 秒)。基本上,数据库中有数万条记录,每次您在文本框中键入一个字符时,应用程序都会访问数据库。我可以将它设置为 2 或 3 个字符,但它不会改变速度,我也不想需要那么多字符。
我对如何优化它有一个想法:在页面加载时,从数据库中获取所有可能的结果并将其发送到客户端(通过隐藏输入或 javascript 数据结构),并让自动完成功能将该客户端数据用作来源。我敢肯定这会快如闪电,但对我来说似乎很奇怪 - 这样做有什么缺点吗?
还有其他方法可以实现更快的自动完成吗?
更新: 好的,显然问题出在我构建 EF 调用的方式上。 EF 取消“记录”最终不是在 sql 查询中构造 WHERE 子句;它每次都获取整个表格,然后 linq 方法正在关闭已经枚举的大量数据 - 每次键入字母时都会发生这种情况 - 导致速度减慢。嗬!我将 .Where 方法移至数据存储层,它在 where 过滤结果后进行枚举,并返回 Dictionary - 现在似乎工作得很好。感谢你的帮助!我标记了对我调查问题最有帮助的答案。
就 Flickr 解决方案/将整组数据提供给客户端而言,我仍然觉得这很奇怪/矫枉过正,但我确信某些大型数据集是有保证的。还将更多地研究 OutputCache 的其他内容。
再次感谢!
【问题讨论】:
-
忘了说,在后面使用了一个ILookup [private readonly ILookup
records = Repository.GetDirectoryRecordsAll();] -
各位,非常感谢您的回复!我正在研究各种选项,并会让您知道最适合我的方案的解决方案
标签: jquery asp.net-mvc jquery-autocomplete