ContextWindow: Use Task.Run to load data outside main thread
All checks were successful
Test / Run tests (push) Successful in 2m29s
All checks were successful
Test / Run tests (push) Successful in 2m29s
This commit is contained in:
@@ -82,10 +82,10 @@ namespace Elwig.Windows {
|
||||
|
||||
Menu_Export_UploadFilters.IsEnabled = App.Config.SyncUrl != null;
|
||||
Menu_Export_UploadAll.IsEnabled = App.Config.SyncUrl != null;
|
||||
ViewModel.ShowOnlyActiveMembers = true;
|
||||
}
|
||||
|
||||
private void Window_Loaded(object sender, RoutedEventArgs evt) {
|
||||
ViewModel.ShowOnlyActiveMembers = true;
|
||||
protected override async Task OnInit(AppDbContext ctx) {
|
||||
UpdateContactInfoVisibility();
|
||||
LockInputs();
|
||||
}
|
||||
@@ -113,46 +113,57 @@ namespace Elwig.Windows {
|
||||
}
|
||||
|
||||
private async Task RefreshList(bool updateSort = false) {
|
||||
using var ctx = new AppDbContext();
|
||||
var (_, memberQuery, filter) = await ViewModel.GetFilters(ctx);
|
||||
var members = await memberQuery
|
||||
.Include(m => m.Branch)
|
||||
.Include(m => m.DefaultWbKg!.AtKg)
|
||||
.Include(m => m.EmailAddresses)
|
||||
.Include(m => m.TelephoneNumbers)
|
||||
.Include(m => m.PostalDest.AtPlz!.Ort)
|
||||
.Include(m => m.PostalDest.AtPlz!.Country)
|
||||
.Include(m => m.BillingAddress!.PostalDest.AtPlz!.Ort)
|
||||
.Include(m => m.BillingAddress!.PostalDest.AtPlz!.Country)
|
||||
.ToListAsync();
|
||||
var vm = ViewModel;
|
||||
var cursor = Mouse.OverrideCursor != null;
|
||||
if (!cursor) Mouse.OverrideCursor = Cursors.Wait;
|
||||
var query = (vm.SearchQuery, vm.ShowOnlyActiveMembers);
|
||||
var (members, totalMemberCount, totalBusinessShares) = await Task.Run(async () => {
|
||||
using var ctx = new AppDbContext();
|
||||
var (_, memberQuery, filter) = await vm.GetFilters(ctx);
|
||||
var members = await memberQuery
|
||||
.Include(m => m.Branch)
|
||||
.Include(m => m.DefaultWbKg!.AtKg)
|
||||
.Include(m => m.EmailAddresses)
|
||||
.Include(m => m.TelephoneNumbers)
|
||||
.Include(m => m.PostalDest.AtPlz!.Ort)
|
||||
.Include(m => m.PostalDest.AtPlz!.Country)
|
||||
.Include(m => m.BillingAddress!.PostalDest.AtPlz!.Ort)
|
||||
.Include(m => m.BillingAddress!.PostalDest.AtPlz!.Country)
|
||||
.ToListAsync();
|
||||
|
||||
if (filter.Count > 0 && members.Count > 0) {
|
||||
var dict = members.AsParallel()
|
||||
.ToDictionary(m => m, m => m.SearchScore(filter))
|
||||
.OrderByDescending(a => a.Value)
|
||||
.ThenBy(a => a.Key.Name)
|
||||
.ThenBy(a => a.Key.GivenName)
|
||||
.ThenBy(a => a.Key.MgNr);
|
||||
var threshold = dict.Select(a => a.Value).Max() * 3 / 4;
|
||||
members = dict
|
||||
.Where(a => a.Value > threshold)
|
||||
.Select(a => a.Key)
|
||||
.ToList();
|
||||
} else {
|
||||
members = members
|
||||
.OrderBy(m => m.Name)
|
||||
.ThenBy(m => m.GivenName)
|
||||
.ThenBy(m => m.MgNr)
|
||||
.ToList();
|
||||
}
|
||||
if (filter.Count > 0 && members.Count > 0) {
|
||||
var dict = members.AsParallel()
|
||||
.ToDictionary(m => m, m => m.SearchScore(filter))
|
||||
.OrderByDescending(a => a.Value)
|
||||
.ThenBy(a => a.Key.Name)
|
||||
.ThenBy(a => a.Key.GivenName)
|
||||
.ThenBy(a => a.Key.MgNr);
|
||||
var threshold = dict.Select(a => a.Value).Max() * 3 / 4;
|
||||
members = [.. dict
|
||||
.Where(a => a.Value > threshold)
|
||||
.Select(a => a.Key)];
|
||||
} else {
|
||||
members = [.. members
|
||||
.OrderBy(m => m.Name)
|
||||
.ThenBy(m => m.GivenName)
|
||||
.ThenBy(m => m.MgNr)];
|
||||
}
|
||||
|
||||
var totalMemberCount = await ctx.Members.CountAsync();
|
||||
var totalBusinessShares = await ctx.Members.SumAsync(m => m.BusinessShares);
|
||||
|
||||
return (members, totalMemberCount, totalBusinessShares);
|
||||
});
|
||||
if (!cursor) Mouse.OverrideCursor = null;
|
||||
if (query != (ViewModel.SearchQuery, ViewModel.ShowOnlyActiveMembers)) return;
|
||||
|
||||
ControlUtils.RenewItemsSource(MemberList, members,
|
||||
MemberList_SelectionChanged, ViewModel.TextFilter.Count > 0 ? ControlUtils.RenewSourceDefault.IfOnly : ControlUtils.RenewSourceDefault.None, !updateSort);
|
||||
if (updateSort && MemberList.SelectedItem != null)
|
||||
MemberList.ScrollIntoView(MemberList.SelectedItem);
|
||||
|
||||
ViewModel.StatusMembers = $"{members.Count:N0} ({await ctx.Members.CountAsync():N0})";
|
||||
ViewModel.StatusBusinessShares = $"{members.Sum(m => m.BusinessShares):N0} ({await ctx.Members.SumAsync(m => m.BusinessShares):N0})";
|
||||
ViewModel.StatusMembers = $"{members.Count:N0} ({totalMemberCount:N0})";
|
||||
ViewModel.StatusBusinessShares = $"{members.Sum(m => m.BusinessShares):N0} ({totalBusinessShares:N0})";
|
||||
}
|
||||
|
||||
private void RefreshInputs(bool validate = false) {
|
||||
|
||||
Reference in New Issue
Block a user