3

当您使用 mvc 为网站键入功能时,我正在实现搜索。

我的控制器接受一个 Searchstring 参数并相应地返回记录。

我所做的是使用这个 javascript 将我的控制器调用到一个 div 中:

$("#SearchField").keyup(function (event) {
    $.ajax({
        cache: false,
        url: 'FolderList?searchString=' + $("#SearchField").val(),
        success: function (data) {
            $('#FolderList').empty().html(data);
        }
    });
});

这是我的控制器代码:

public ActionResult Search(string searchString, int? page)
        {

            var folders = db.Folders.AsQueryable();

            if (!String.IsNullOrEmpty(searchString))
            {
                folders = folders.Where(p => p.SearchField.ToLower().Contains(searchString.ToLower()));
            }

            int pageSize = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["FolderPageSize"]);
            int pageNumber = (page ?? 1);

            return View(folders.ToPagedList(pageNumber, pageSize));
        }

问题是我在控制器(文件夹)中请求的数据库实体加载非常缓慢(数据库问题)。当您键入功能时,它会使搜索滞后很多,并且根本不可用。这是一个我无法从源头上解决的问题,我必须处理它。

所以我的问题是:有没有办法在内存中加载文件夹数据库实体,所以加载页面需要很长时间,但每次调用控制器之后都会很快。还是我实现这一目标的方式错了?还有其他方法吗?

4

1 回答 1

3

如果文件夹不包含大量数据,则在应用程序启动时加载所有行并将它们存储在缓存中是完全合理的,例如

Cache["folders"] = (from f in folders select f).ToList();

然后,更换

folders = folders.Where(p => p.SearchField.ToLower().Contains(searchString.ToLower()));

folders = Cache["folders"].Where(p => p.SearchField.ToLower().Contains(searchString.ToLower()));

请记住,如果应用程序域回收,缓存将清空。如果读取所有必要的行来填充缓存需要很长时间,您可能需要计划在应用程序域启动/回收时预热缓存。

于 2012-08-20T06:46:30.757 回答