В последнее время я имел дело с проблемой, и хотя у меня есть некоторые решения, я бы хотел найти лучшее с любой точки зрения.
Допустим, у меня есть приложение WPF с EF Core. В моей базе данных около 3000 клиентов (в моем случае SQLite, но в будущем это должно работать и с более медленными). Когда пользователь открывает список клиентов, я загружаю только некоторые из них (количество = 50, страница = 0) в алфавитном порядке. Как только пользователь прокручивает страницу вниз, загружается еще 50 (количество = 50, страница = 1).
CustomerRepository.GetQueryableAll().Skip(page * quantity).Take(quantity).ToList();
Все отлично работает. Здесь возникает проблема: есть кнопка для создания нового клиента, которая открывает модальное окно. Допустим, пользователь создает клиента с начальной буквой W. Как только он / она нажимает SAVE, новый клиент сохраняется в базе данных, окно закрывается, и список необходимо перезагрузить. Но загрузка всего списка до W, конечно, очень медленная.
До сих пор я пытался выполнить запрос к базе данных в фоновом режиме и сохранить количество клиентов, начинающих с каждой буквы базы данных, в статическом словаре: как только удастся сохранить SAVE, я смогу угадать, сколько или больше «страниц» пропустить () в базе данных и получить группу из 50, в которой будет новый клиент. Это работает, это довольно быстро, но я боюсь, что это не будет работать в странах с нелатинскими алфавитами:
public async Task<Dictionary<char, int>> GetCustomersByInitialsCount()
{
return await Task.Run(async delegate
{
var dictionary = new Dictionary<char, int>();
for (char c = 'A'; c <= 'Z'; c++)
{
var count = await CustomerRepository.GetCustomerCountStartingWith(c.ToString());
dictionary.Add(c, count);
}
return dictionary;
});
}
[... and in the repository:]
public async Task<int> GetCustomerCountStartingWith(string startingLetter)
{
using (var dbContext = new MyDbContext())
{
return await dbContext.Set<Customer>().CountAsync(p => p.LastName.ToUpper().StartsWith(startingLetter.ToUpper()));
}
}
В противном случае вместо этого фонового запроса я мог бы также попытаться «угадать» нужную страницу в зависимости от начального символа, но я все еще озадачен неожиданными результатами, которые я мог получить с нелатинскими языками.
Если кто-нибудь знает лучшие инструменты или есть другие полезные идеи, я с удовольствием их рассмотрю!
Большое спасибо заранее и счастливого кодирования.