diff --git a/src/BootstrapBlazor/BootstrapBlazor.csproj b/src/BootstrapBlazor/BootstrapBlazor.csproj index 3056f2607c2a704f5d17c37b29026c3136b9c86d..60721e6c0d51da04bb66f128388da8e6bbcfc478 100644 --- a/src/BootstrapBlazor/BootstrapBlazor.csproj +++ b/src/BootstrapBlazor/BootstrapBlazor.csproj @@ -1,7 +1,7 @@ - 6.1.2-beta11 + 6.1.2-beta12 diff --git a/src/BootstrapBlazor/Extensions/LambdaExtensions.cs b/src/BootstrapBlazor/Extensions/LambdaExtensions.cs index 8bf134c1fff687bf052501b53a5f4fefd147e69b..e443fc09d8e3a8adaef9f180b88eae0e739a57db 100644 --- a/src/BootstrapBlazor/Extensions/LambdaExtensions.cs +++ b/src/BootstrapBlazor/Extensions/LambdaExtensions.cs @@ -248,6 +248,46 @@ public static class LambdaExtensions return ret; } + /// + /// IQueryable 排序扩展方法 + /// + /// + /// + /// + /// + public static IQueryable Sort(this IQueryable items, List sortList) + { + if (sortList.Any()) + { + for (var index = 0; index < sortList.Count; index++) + { + var sortExp = sortList[index]; + var segs = sortExp.Split(' ', StringSplitOptions.RemoveEmptyEntries); + var sortOrder = SortOrder.Asc; + var sortName = sortExp; + if (segs.Length == 2) + { + sortName = segs[0]; + if (segs[1].Equals("desc", StringComparison.OrdinalIgnoreCase)) + { + sortOrder = SortOrder.Desc; + } + } + if (index == 0) + { + // OrderBy + items = QueryableOrderBy(items, sortName, sortOrder); + } + else + { + // ThenBy + items = QueryableThenBy(items, sortName, sortOrder); + } + } + } + return items; + } + /// /// 获得排序 Expression 表达式 /// @@ -322,10 +362,30 @@ public static class LambdaExtensions return ret ?? query; } + private static IQueryable QueryableThenBy(IQueryable query, string propertyName, SortOrder sortOrder) + { + IQueryable? ret = null; + var methodName = sortOrder == SortOrder.Desc ? nameof(ThenByDescendingInternal) : nameof(ThenByInternal); + + var pi = typeof(TItem).GetPropertyByName(propertyName); + if (pi != null) + { + var mi = typeof(LambdaExtensions) + .GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Static)? + .MakeGenericMethod(typeof(TItem), pi.PropertyType); + ret = mi?.Invoke(null, new object[] { query, pi }) as IOrderedQueryable; + } + return ret ?? query; + } + private static IOrderedQueryable OrderByInternal(IQueryable query, System.Reflection.PropertyInfo memberProperty) => query.OrderBy(GetPropertyLambda(memberProperty)); private static IOrderedQueryable OrderByDescendingInternal(IQueryable query, System.Reflection.PropertyInfo memberProperty) => query.OrderByDescending(GetPropertyLambda(memberProperty)); + private static IOrderedQueryable ThenByInternal(IOrderedQueryable query, System.Reflection.PropertyInfo memberProperty) => query.ThenBy(GetPropertyLambda(memberProperty)); + + private static IOrderedQueryable ThenByDescendingInternal(IOrderedQueryable query, System.Reflection.PropertyInfo memberProperty) => query.ThenByDescending(GetPropertyLambda(memberProperty)); + private static Expression> GetPropertyLambda(PropertyInfo pi) { if (pi.PropertyType != typeof(TKey))