diff --git a/v2rayN/ServiceLib/Global.cs b/v2rayN/ServiceLib/Global.cs index ebffeb26..41db1f49 100644 --- a/v2rayN/ServiceLib/Global.cs +++ b/v2rayN/ServiceLib/Global.cs @@ -92,6 +92,7 @@ public class Global public const string LinuxBash = "/bin/bash"; public const string StringTrue = "true"; public const string StringFalse = "false"; + public const int SqliteMaxBatchSize = 10000; public const string SingboxDirectDNSTag = "direct_dns"; public const string SingboxRemoteDNSTag = "remote_dns"; diff --git a/v2rayN/ServiceLib/Manager/AppManager.cs b/v2rayN/ServiceLib/Manager/AppManager.cs index 203c0417..5e97e3d5 100644 --- a/v2rayN/ServiceLib/Manager/AppManager.cs +++ b/v2rayN/ServiceLib/Manager/AppManager.cs @@ -244,9 +244,26 @@ public sealed class AppManager { return []; } - return await SQLiteHelper.Instance.TableAsync() - .Where(it => ids.Contains(it.IndexId)) - .ToListAsync(); + + if (ids.Count <= Global.SqliteMaxBatchSize) + { + return await SQLiteHelper.Instance.TableAsync() + .Where(it => ids.Contains(it.IndexId)) + .ToListAsync(); + } + + var items = new List(); + for (var size = 0; size < ids.Count; size += Global.SqliteMaxBatchSize) + { + var chunk = ids.Skip(size).Take(Global.SqliteMaxBatchSize).ToList(); + var chunkItems = await SQLiteHelper.Instance.TableAsync() + .Where(it => chunk.Contains(it.IndexId)) + .ToListAsync(); + + items.AddRange(chunkItems); + } + + return items; } public async Task> GetProfileItemsByIndexIdsAsMap(IEnumerable indexIds) @@ -257,18 +274,11 @@ public sealed class AppManager 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 ids = indexIds.Where(id => !id.IsNullOrEmpty()).Distinct().ToList(); + var items = await GetProfileItemsByIndexIds(ids); var itemMap = items.ToDictionary(it => it.IndexId); - return idList.Select(itemMap.GetValueOrDefault) + return ids.Select(itemMap.GetValueOrDefault) .Where(item => item != null) .ToList(); } diff --git a/v2rayN/ServiceLib/Resx/ResUI.Designer.cs b/v2rayN/ServiceLib/Resx/ResUI.Designer.cs index 216f3fb0..a960dbb6 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.Designer.cs +++ b/v2rayN/ServiceLib/Resx/ResUI.Designer.cs @@ -3862,7 +3862,7 @@ namespace ServiceLib.Resx { } /// - /// 查找类似 For multi-interface environments, enter the name of the interface to bind. Only effective on Windows systems or TUN mode 的本地化字符串。 + /// 查找类似 For multi-interface environments, enter the interface name for outbound connections. On Linux/macOS, it only works when TUN mode is enabled. 的本地化字符串。 /// public static string TbSettingsBindInterfaceTip { get {