diff --git a/v2rayN/ServiceLib/Common/QueryableExtension.cs b/v2rayN/ServiceLib/Common/QueryableExtension.cs
deleted file mode 100644
index b8e91433..00000000
--- a/v2rayN/ServiceLib/Common/QueryableExtension.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-using System.Linq.Expressions;
-using System.Reflection;
-
-namespace ServiceLib.Common
-{
-    public static class QueryableExtension
-    {
-        public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> query, string propertyName)
-        {
-            return _OrderBy<T>(query, propertyName, false);
-        }
-
-        public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> query, string propertyName)
-        {
-            return _OrderBy<T>(query, propertyName, true);
-        }
-
-        private static IOrderedQueryable<T> _OrderBy<T>(IQueryable<T> query, string propertyName, bool isDesc)
-        {
-            var methodname = (isDesc) ? "OrderByDescendingInternal" : "OrderByInternal";
-
-            var memberProp = typeof(T).GetProperty(propertyName);
-
-            var method = typeof(QueryableExtension).GetMethod(methodname)
-                                       .MakeGenericMethod(typeof(T), memberProp.PropertyType);
-
-            return (IOrderedQueryable<T>)method.Invoke(null, new object[] { query, memberProp });
-        }
-
-        public static IOrderedQueryable<T> OrderByInternal<T, TProp>(IQueryable<T> query, PropertyInfo memberProperty)
-        {//public
-            return query.OrderBy(_GetLambda<T, TProp>(memberProperty));
-        }
-
-        public static IOrderedQueryable<T> OrderByDescendingInternal<T, TProp>(IQueryable<T> query, PropertyInfo memberProperty)
-        {//public
-            return query.OrderByDescending(_GetLambda<T, TProp>(memberProperty));
-        }
-
-        private static Expression<Func<T, TProp>> _GetLambda<T, TProp>(PropertyInfo memberProperty)
-        {
-            if (memberProperty.PropertyType != typeof(TProp)) throw new Exception();
-
-            var thisArg = Expression.Parameter(typeof(T));
-            var lambda = Expression.Lambda<Func<T, TProp>>(Expression.Property(thisArg, memberProperty), thisArg);
-
-            return lambda;
-        }
-    }
-}
\ No newline at end of file
diff --git a/v2rayN/ServiceLib/Handler/ConfigHandler.cs b/v2rayN/ServiceLib/Handler/ConfigHandler.cs
index 39d6cb1c..2424db49 100644
--- a/v2rayN/ServiceLib/Handler/ConfigHandler.cs
+++ b/v2rayN/ServiceLib/Handler/ConfigHandler.cs
@@ -766,69 +766,66 @@ namespace ServiceLib.Handler
                               }).ToList();
 
             Enum.TryParse(colName, true, out EServerColName name);
-            var propertyName = string.Empty;
-            switch (name)
-            {
-                case EServerColName.ConfigType:
-                case EServerColName.Remarks:
-                case EServerColName.Address:
-                case EServerColName.Port:
-                case EServerColName.Network:
-                case EServerColName.StreamSecurity:
-                    propertyName = name.ToString();
-                    break;
-
-                case EServerColName.DelayVal:
-                    propertyName = "Delay";
-                    break;
-
-                case EServerColName.SpeedVal:
-                    propertyName = "Speed";
-                    break;
-
-                case EServerColName.SubRemarks:
-                    propertyName = "Subid";
-                    break;
-
-                default:
-                    return -1;
-            }
-
-            var items = lstProfile.AsQueryable();
 
             if (asc)
             {
-                lstProfile = items.OrderBy(propertyName).ToList();
+                lstProfile = name switch
+                {
+                    EServerColName.ConfigType => lstProfile.OrderBy(t => t.ConfigType).ToList(),
+                    EServerColName.Remarks => lstProfile.OrderBy(t => t.Remarks).ToList(),
+                    EServerColName.Address => lstProfile.OrderBy(t => t.Address).ToList(),
+                    EServerColName.Port => lstProfile.OrderBy(t => t.Port).ToList(),
+                    EServerColName.Network => lstProfile.OrderBy(t => t.Network).ToList(),
+                    EServerColName.StreamSecurity => lstProfile.OrderBy(t => t.StreamSecurity).ToList(),
+                    EServerColName.DelayVal => lstProfile.OrderBy(t => t.Delay).ToList(),
+                    EServerColName.SpeedVal => lstProfile.OrderBy(t => t.Speed).ToList(),
+                    EServerColName.SubRemarks => lstProfile.OrderBy(t => t.Subid).ToList(),
+                    _ => lstProfile
+                };
             }
             else
             {
-                lstProfile = items.OrderByDescending(propertyName).ToList();
+                lstProfile = name switch
+                {
+                    EServerColName.ConfigType => lstProfile.OrderByDescending(t => t.ConfigType).ToList(),
+                    EServerColName.Remarks => lstProfile.OrderByDescending(t => t.Remarks).ToList(),
+                    EServerColName.Address => lstProfile.OrderByDescending(t => t.Address).ToList(),
+                    EServerColName.Port => lstProfile.OrderByDescending(t => t.Port).ToList(),
+                    EServerColName.Network => lstProfile.OrderByDescending(t => t.Network).ToList(),
+                    EServerColName.StreamSecurity => lstProfile.OrderByDescending(t => t.StreamSecurity).ToList(),
+                    EServerColName.DelayVal => lstProfile.OrderByDescending(t => t.Delay).ToList(),
+                    EServerColName.SpeedVal => lstProfile.OrderByDescending(t => t.Speed).ToList(),
+                    EServerColName.SubRemarks => lstProfile.OrderByDescending(t => t.Subid).ToList(),
+                    _ => lstProfile
+                };
             }
-            for (int i = 0; i < lstProfile.Count; i++)
+
+            for (var i = 0; i < lstProfile.Count; i++)
             {
                 ProfileExHandler.Instance.SetSort(lstProfile[i].IndexId, (i + 1) * 10);
             }
-            if (name == EServerColName.DelayVal)
+            switch (name)
             {
-                var maxSort = lstProfile.Max(t => t.Sort) + 10;
-                foreach (var item in lstProfile)
-                {
-                    if (item.Delay <= 0)
+                case EServerColName.DelayVal:
                     {
-                        ProfileExHandler.Instance.SetSort(item.IndexId, maxSort);
+                        var maxSort = lstProfile.Max(t => t.Sort) + 10;
+                        foreach (var item in lstProfile.Where(item => item.Delay <= 0))
+                        {
+                            ProfileExHandler.Instance.SetSort(item.IndexId, maxSort);
+                        }
+
+                        break;
                     }
-                }
-            }
-            if (name == EServerColName.SpeedVal)
-            {
-                var maxSort = lstProfile.Max(t => t.Sort) + 10;
-                foreach (var item in lstProfile)
-                {
-                    if (item.Speed <= 0)
+                case EServerColName.SpeedVal:
                     {
-                        ProfileExHandler.Instance.SetSort(item.IndexId, maxSort);
+                        var maxSort = lstProfile.Max(t => t.Sort) + 10;
+                        foreach (var item in lstProfile.Where(item => item.Speed <= 0))
+                        {
+                            ProfileExHandler.Instance.SetSort(item.IndexId, maxSort);
+                        }
+
+                        break;
                     }
-                }
             }
 
             return 0;