【发布时间】:2019-06-07 07:04:41
【问题描述】:
我最近一直在处理一个问题,虽然我有一些解决方案,但我想从各个角度找到最好的解决方案。
假设我有一个带有 EF Core 的 WPF 应用程序。我的数据库中有大约 3000 个客户(在我的情况下是 SQLite,但将来这也应该适用于速度较慢的客户)。当用户打开客户列表时,我仅按字母顺序加载其中一些(数量 = 50,页面 = 0)。一旦用户向下滚动到底部,就会再加载 50 个(数量 = 50,页面 = 1)。
CustomerRepository.GetQueryableAll().Skip(page * quantity).Take(quantity).ToList();
一切正常。但是问题来了:有一个按钮可以创建一个新客户,它会打开一个模式窗口。假设用户创建了一个以 W 开头的客户。一旦他/她点击 SAVE,新客户就会保存到数据库中,窗口关闭,并且必须重新加载列表。但是,将整个列表加载到 W 之前当然非常慢。
到目前为止,我已经尝试在后台任务中查询数据库,并将有多少客户以数据库的每个字母开头存储在静态字典中:只要点击 SAVE,我就能或多或少猜出多少“pages”到数据库中的 Skip() 并获取新客户所在的 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()));
}
}
否则,除了这个后台查询,我还可以尝试根据起始字符“猜测”正确的页面,但我仍然对非拉丁语言可能产生的意外结果感到困惑。
如果有人知道更好的工具或有任何其他有用的想法,我很乐意考虑!
非常感谢您提前祝您编码愉快。
【问题讨论】:
-
如果你有无限分页和按pageIndex分页怎么办。在新用户之后,您只需从当前页面加载列表?
标签: c# wpf listbox entity-framework-core