From 59b51b39ad388a5850c16afb7e65c7df1319292d Mon Sep 17 00:00:00 2001 From: Argo-Tianyi Date: Tue, 4 Jan 2022 14:54:05 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=A4=9A?= =?UTF-8?q?=E5=88=97=E6=8E=92=E5=BA=8F=20Sort=20=E6=8B=89=E5=A7=86?= =?UTF-8?q?=E8=BE=BE=E8=A1=A8=E8=BE=BE=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/LambdaExtensions.cs | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/BootstrapBlazor/Extensions/LambdaExtensions.cs b/src/BootstrapBlazor/Extensions/LambdaExtensions.cs index 8bf134c1f..e443fc09d 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)) -- Gitee From 81d6a4020013ea882c06c03a7c63f3e1e428cb9f Mon Sep 17 00:00:00 2001 From: Argo-Tianyi Date: Tue, 4 Jan 2022 14:54:15 +0800 Subject: [PATCH 2/2] chore: bump version beta12 --- src/BootstrapBlazor/BootstrapBlazor.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/BootstrapBlazor.csproj b/src/BootstrapBlazor/BootstrapBlazor.csproj index 3056f2607..60721e6c0 100644 --- a/src/BootstrapBlazor/BootstrapBlazor.csproj +++ b/src/BootstrapBlazor/BootstrapBlazor.csproj @@ -1,7 +1,7 @@ - 6.1.2-beta11 + 6.1.2-beta12 -- Gitee