From fd577933f2612d117b5adc3dc78dd6b8116b06f3 Mon Sep 17 00:00:00 2001 From: DHR60 Date: Sat, 28 Feb 2026 16:37:12 +0800 Subject: [PATCH] Optimize db read --- v2rayN/ServiceLib/Manager/AppManager.cs | 18 ++++++++++++++++++ .../ServiceLib/Manager/GroupProfileManager.cs | 18 ++++-------------- .../ViewModels/AddGroupServerViewModel.cs | 11 ++--------- .../ViewModels/ProfilesSelectViewModel.cs | 14 +------------- .../ServiceLib/ViewModels/ProfilesViewModel.cs | 9 +-------- 5 files changed, 26 insertions(+), 44 deletions(-) diff --git a/v2rayN/ServiceLib/Manager/AppManager.cs b/v2rayN/ServiceLib/Manager/AppManager.cs index 87b035e9..43c5611d 100644 --- a/v2rayN/ServiceLib/Manager/AppManager.cs +++ b/v2rayN/ServiceLib/Manager/AppManager.cs @@ -248,6 +248,24 @@ public sealed class AppManager return items.ToDictionary(it => it.IndexId); } + public async Task> GetProfileItemsOrderedByIndexIds(IEnumerable indexIds) + { + var idList = indexIds.Where(id => !id.IsNullOrEmpty()).Distinct().ToList(); + if (idList.Count == 0) + { + return []; + } + + var items = await SQLiteHelper.Instance.TableAsync() + .Where(it => idList.Contains(it.IndexId)) + .ToListAsync(); + var itemMap = items.ToDictionary(it => it.IndexId); + + return idList.Select(id => itemMap.GetValueOrDefault(id)) + .Where(item => item != null) + .ToList(); + } + public async Task GetProfileItemViaRemarks(string? remarks) { if (remarks.IsNullOrEmpty()) diff --git a/v2rayN/ServiceLib/Manager/GroupProfileManager.cs b/v2rayN/ServiceLib/Manager/GroupProfileManager.cs index 9e0cceb0..8a7389a0 100644 --- a/v2rayN/ServiceLib/Manager/GroupProfileManager.cs +++ b/v2rayN/ServiceLib/Manager/GroupProfileManager.cs @@ -52,10 +52,10 @@ public class GroupProfileManager return false; } - foreach (var child in childIds) + var childItems = await AppManager.Instance.GetProfileItemsByIndexIds(childIds); + foreach (var childItem in childItems) { - var childItem = await AppManager.Instance.GetProfileItem(child); - if (await HasCycle(child, childItem?.GetProtocolExtra(), visited, stack)) + if (await HasCycle(childItem.IndexId, childItem?.GetProtocolExtra(), visited, stack)) { return true; } @@ -103,17 +103,7 @@ public class GroupProfileManager return []; } - var profileMap = await AppManager.Instance.GetProfileItemsByIndexIdsAsMap(childProfileIds); - - var ordered = new List(childProfileIds.Count); - foreach (var id in childProfileIds) - { - if (id != null && profileMap.TryGetValue(id, out var item) && item != null) - { - ordered.Add(item); - } - } - + var ordered = await AppManager.Instance.GetProfileItemsOrderedByIndexIds(childProfileIds); return ordered; } diff --git a/v2rayN/ServiceLib/ViewModels/AddGroupServerViewModel.cs b/v2rayN/ServiceLib/ViewModels/AddGroupServerViewModel.cs index d30917ec..7d4d0948 100644 --- a/v2rayN/ServiceLib/ViewModels/AddGroupServerViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/AddGroupServerViewModel.cs @@ -99,15 +99,8 @@ public class AddGroupServerViewModel : MyReactiveObject Filter = protocolExtra?.Filter; var childIndexIds = Utils.String2List(protocolExtra?.ChildItems) ?? []; - foreach (var item in childIndexIds) - { - var child = await AppManager.Instance.GetProfileItem(item); - if (child == null) - { - continue; - } - ChildItemsObs.Add(child); - } + var childItemList = await AppManager.Instance.GetProfileItemsOrderedByIndexIds(childIndexIds); + ChildItemsObs.AddRange(childItemList); } public async Task ChildRemoveAsync() diff --git a/v2rayN/ServiceLib/ViewModels/ProfilesSelectViewModel.cs b/v2rayN/ServiceLib/ViewModels/ProfilesSelectViewModel.cs index ce349cb4..eb010c58 100644 --- a/v2rayN/ServiceLib/ViewModels/ProfilesSelectViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/ProfilesSelectViewModel.cs @@ -255,19 +255,7 @@ public class ProfilesSelectViewModel : MyReactiveObject { return null; } - var lst = new List(); - foreach (var sp in SelectedProfiles) - { - if (string.IsNullOrEmpty(sp?.IndexId)) - { - continue; - } - var item = await AppManager.Instance.GetProfileItem(sp.IndexId); - if (item != null) - { - lst.Add(item); - } - } + var lst = await AppManager.Instance.GetProfileItemsOrderedByIndexIds(SelectedProfiles.Select(sp => sp?.IndexId)); if (lst.Count == 0) { NoticeManager.Instance.Enqueue(ResUI.PleaseSelectServer); diff --git a/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs b/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs index 2b0de98d..edeec49e 100644 --- a/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs @@ -456,14 +456,7 @@ public class ProfilesViewModel : MyReactiveObject var orderProfiles = SelectedProfiles?.OrderBy(t => t.Sort); if (latest) { - foreach (var profile in orderProfiles) - { - var item = await AppManager.Instance.GetProfileItem(profile.IndexId); - if (item is not null) - { - lstSelected.Add(item); - } - } + lstSelected.AddRange(await AppManager.Instance.GetProfileItemsOrderedByIndexIds(orderProfiles.Select(sp => sp?.IndexId))); } else {