3

mvc を使用して Web サイトの機能を入力すると、検索を実装しています。

私のコントローラーは 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 に答える