были бы рады вашим мыслям по этому поводу.
Я использую автозаполнение jQuery в приложении ASP.NET MVC для получения списка записей из базы данных - я хотел бы знать, есть ли лучший способ, чем тот, который я делаю сейчас, - следующим образом:
Вот 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 для «записей» в конечном итоге не создавал предложение WHERE в запросе sql; он получал всю таблицу каждый раз, а затем методы linq выходили из этой уже пронумерованной массы данных - это происходило каждый раз, когда вводилась буква, - вызывая замедление. Дох! Я переместил метод .Where на уровень репозитория данных, где он перечисляет после того, как where фильтрует результаты и возвращает словарь - теперь кажется, что он отлично работает. Спасибо за вашу помощь! Я отметил самый полезный ответ, который помог мне разобраться в проблеме.
Что касается решения Flickr / предоставления всего набора данных клиенту, я все еще чувствую, что это странно / излишне, но я уверен, что это оправдано с некоторыми большими наборами данных. Также я буду больше изучать OutputCache для других вещей.
Еще раз спасибо!