From bd5808de717c85fdd1013a32cd1d52dad19eae11 Mon Sep 17 00:00:00 2001 From: YHS Date: Fri, 5 Jan 2024 22:48:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96ToPivotTable=E5=92=8CToPivotL?= =?UTF-8?q?ist=201.=20=E8=BF=9B=E4=B8=80=E6=AD=A5=E7=9A=84=E6=8F=90?= =?UTF-8?q?=E5=8D=87=E8=BD=AC=E6=8D=A2=E6=95=88=E7=8E=87=20=20=E4=B8=80?= =?UTF-8?q?=E7=99=BE=E4=B8=87=E8=A1=8C=E8=BD=AC=E6=8D=A2=E4=B8=80=E5=8D=83?= =?UTF-8?q?=E5=88=97=E4=B8=8D=E5=88=B0=E4=B8=80=E7=A7=92=E5=AE=8C=E6=88=90?= =?UTF-8?q?=202.=20.ToPivotTable(it=20=3D>=20it.day,=20it=20=3D>new{=20it.?= =?UTF-8?q?name},=20it=20=3D>=20it.Sum(x=20=3D>=20x.count))=20=20=20=20=20?= =?UTF-8?q?it.day=20=E5=AD=98=E5=9C=A8=E7=A9=BA=E5=80=BC=E4=BC=9A=E9=80=A0?= =?UTF-8?q?=E6=88=90=E5=88=97=E5=90=8D=E4=B8=8E=E5=88=97=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=AF=B9=E4=B8=8D=E9=BD=90=203.=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=87=8F=E5=B0=8F=E5=86=85=E5=AD=98=E6=B6=88=E8=80=97?= =?UTF-8?q?=EF=BC=8C=E5=87=8F=E5=B0=91=E5=BE=AA=E7=8E=AF=E6=AC=A1=E6=95=B0?= =?UTF-8?q?=204.=20=E5=B0=86ToPivotList=E7=9A=84=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=80=BC=20List=20=E6=94=B9=E4=B8=BA=20IEnumerable=20=E5=87=8F=E5=B0=91=E5=86=85=E5=AD=98=E8=AF=BB=E5=86=99?= =?UTF-8?q?=E6=AC=A1=E6=95=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QueryableProvider/QueryableExecuteSql.cs | 2 +- Src/Asp.Net/SqlSugar/Interface/IQueryable.cs | 2 +- .../SqlSugar/Utilities/DataTableExtensions.cs | 124 +++++++--------- .../QueryableProvider/QueryableExecuteSql.cs | 2 +- .../SqlSugar/Interface/IQueryable.cs | 2 +- .../SqlSugar/Utilities/DataTableExtensions.cs | 134 +++++++----------- 6 files changed, 104 insertions(+), 162 deletions(-) diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs index 284527d09..5b553f702 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs @@ -228,7 +228,7 @@ namespace SqlSugar { return this.ToList().ToPivotTable(columnSelector, rowSelector, dataSelector); } - public virtual List ToPivotList(Func columnSelector, Expression> rowSelector, Func, TData> dataSelector) + public virtual IEnumerable ToPivotList(Func columnSelector, Expression> rowSelector, Func, TData> dataSelector) { return this.ToList().ToPivotList(columnSelector, rowSelector, dataSelector); } diff --git a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs index 2b704f1a0..586a0e900 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs @@ -286,7 +286,7 @@ namespace SqlSugar ISugarQueryable IgnoreColumns(Expression> columns); ISugarQueryable IgnoreColumns(params string[] columns); DataTable ToPivotTable(Func columnSelector,Expression> rowSelector,Func, TData> dataSelector); - List ToPivotList(Func columnSelector, Expression> rowSelector, Func, TData> dataSelector); + IEnumerable ToPivotList(Func columnSelector, Expression> rowSelector, Func, TData> dataSelector); string ToPivotJson(Func columnSelector, Expression> rowSelector, Func, TData> dataSelector); ISugarQueryable SplitTable(Func,IEnumerable> getTableNamesFunc); ISugarQueryable SplitTable(DateTime beginTime,DateTime endTime); diff --git a/Src/Asp.Net/SqlSugar/Utilities/DataTableExtensions.cs b/Src/Asp.Net/SqlSugar/Utilities/DataTableExtensions.cs index 8582c05ec..615b10138 100644 --- a/Src/Asp.Net/SqlSugar/Utilities/DataTableExtensions.cs +++ b/Src/Asp.Net/SqlSugar/Utilities/DataTableExtensions.cs @@ -19,59 +19,51 @@ namespace SqlSugar Func, TData> dataSelector) { DataTable table = new DataTable(); + var rowName = new List(); if (rowSelector.Body is MemberExpression) rowName.Add(((MemberExpression)rowSelector.Body).Member.Name); else rowName.AddRange(((NewExpression)rowSelector.Body).Arguments.Select(it => it as MemberExpression).Select(it => it.Member.Name)); + table.Columns.AddRange(rowName.Select(x => new DataColumn(x)).ToArray()); var columns = source.Select(columnSelector).Distinct(); - - foreach (var column in columns) - table.Columns.Add(new DataColumn(column?.ToString())); + table.Columns.AddRange(columns.Select(x => new DataColumn(x?.ToString())).ToArray()); var rows = source.GroupBy(rowSelector.Compile()) - .Select(rowGroup => new - { - Key = rowGroup.Key, - Values = columns.GroupJoin( - rowGroup, - c => c, - r => columnSelector(r), - (c, columnGroup) => dataSelector(columnGroup)) - }); - - foreach (var row in rows) - { - var dataRow = table.NewRow(); - var items = row.Values.Cast().ToList(); - // 获取匿名对象的动态类型 - var anonymousType = row.Key.GetType(); - - // 获取匿名对象的所有属性 - var properties = anonymousType.GetProperties(); - - for (var i = 0; i < rowName.Count; i++) - { - items.Insert(i, properties[i].GetValue(row.Key, null)); - } - dataRow.ItemArray = items.ToArray(); - table.Rows.Add(dataRow); - } + .Select(rowGroup => + { + var anonymousType = rowGroup.Key.GetType(); + var properties = anonymousType.GetProperties(); + var row = table.NewRow(); + columns.GroupJoin(rowGroup, c => c, r => columnSelector(r), + (c, columnGroup) => + { + var dic = new Dictionary(); + if (c != null) + dic[c.ToString()] = dataSelector(columnGroup); + return dic; + }) + .SelectMany(x => x) + .Select(x => row[x.Key] = x.Value) + .SelectMany(x => properties, (x, y) => row[y.Name] = y.GetValue(rowGroup.Key, null)) + .ToArray(); + table.Rows.Add(row); + return row; + } + ).ToList(); return table; } - public static List ToPivotList( - this IEnumerable source, - Func columnSelector, - Expression> rowSelector, - Func, TData> dataSelector) + public static IEnumerable ToPivotList( + this IEnumerable source, + Func columnSelector, + Expression> rowSelector, + Func, TData> dataSelector) { - var arr = new List(); - var cols = new List(); var rowName = new List(); if (rowSelector.Body is MemberExpression) rowName.Add(((MemberExpression)rowSelector.Body).Member.Name); @@ -80,47 +72,27 @@ namespace SqlSugar var columns = source.Select(columnSelector).Distinct(); - cols = rowName.Concat(columns.Select(x => x?.ToString())).ToList(); - var rows = source.GroupBy(rowSelector.Compile()) - .Select(rowGroup => new - { - Key = rowGroup.Key, - Values = columns.GroupJoin( - rowGroup, - c => c, - r => columnSelector(r), - (c, columnGroup) => dataSelector(columnGroup)) - }); - - foreach (var row in rows) - { - var items = row.Values.Cast().ToList(); - - // 获取匿名对象的动态类型 - var anonymousType = row.Key.GetType(); - - // 获取匿名对象的所有属性 - var properties = anonymousType.GetProperties(); - - for (var i = 0; i < rowName.Count; i++) + .Select(rowGroup => { - items.Insert(i, properties[i].GetValue(row.Key, null)); - } - var obj = GetAnonymousObject(cols, items); - arr.Add(obj); - } - return arr; - } - private static dynamic GetAnonymousObject(IEnumerable columns, IEnumerable values) - { - IDictionary eo = new ExpandoObject() as IDictionary; - int i; - for (i = 0; i < columns.Count(); i++) - { - eo.Add(columns.ElementAt(i), values.ElementAt(i)); - } - return eo; + var anonymousType = rowGroup.Key.GetType(); + var properties = anonymousType.GetProperties(); + IDictionary row = new ExpandoObject(); + columns.GroupJoin(rowGroup, c => c, r => columnSelector(r), + (c, columnGroup) => + { + IDictionary dic = new ExpandoObject(); + if (c != null) + dic[c.ToString()] = dataSelector(columnGroup); + return dic; + }) + .SelectMany(x => x) + .Select(x => row[x.Key] = x.Value) + .SelectMany(x => properties, (x, y) => row[y.Name] = y.GetValue(rowGroup.Key, null)) + .ToList(); + return row; + }); + return rows; } } } diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs index 284527d09..5b553f702 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs @@ -228,7 +228,7 @@ namespace SqlSugar { return this.ToList().ToPivotTable(columnSelector, rowSelector, dataSelector); } - public virtual List ToPivotList(Func columnSelector, Expression> rowSelector, Func, TData> dataSelector) + public virtual IEnumerable ToPivotList(Func columnSelector, Expression> rowSelector, Func, TData> dataSelector) { return this.ToList().ToPivotList(columnSelector, rowSelector, dataSelector); } diff --git a/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs b/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs index 2b704f1a0..586a0e900 100644 --- a/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs +++ b/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs @@ -286,7 +286,7 @@ namespace SqlSugar ISugarQueryable IgnoreColumns(Expression> columns); ISugarQueryable IgnoreColumns(params string[] columns); DataTable ToPivotTable(Func columnSelector,Expression> rowSelector,Func, TData> dataSelector); - List ToPivotList(Func columnSelector, Expression> rowSelector, Func, TData> dataSelector); + IEnumerable ToPivotList(Func columnSelector, Expression> rowSelector, Func, TData> dataSelector); string ToPivotJson(Func columnSelector, Expression> rowSelector, Func, TData> dataSelector); ISugarQueryable SplitTable(Func,IEnumerable> getTableNamesFunc); ISugarQueryable SplitTable(DateTime beginTime,DateTime endTime); diff --git a/Src/Asp.NetCore2/SqlSugar/Utilities/DataTableExtensions.cs b/Src/Asp.NetCore2/SqlSugar/Utilities/DataTableExtensions.cs index 0065be726..bedf25e72 100644 --- a/Src/Asp.NetCore2/SqlSugar/Utilities/DataTableExtensions.cs +++ b/Src/Asp.NetCore2/SqlSugar/Utilities/DataTableExtensions.cs @@ -2,10 +2,8 @@ using System.Collections.Generic; using System.Data; using System.Dynamic; -using System.IO; using System.Linq; using System.Linq.Expressions; -using System.Reflection; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; @@ -15,65 +13,57 @@ namespace SqlSugar internal static class DataTableExtensions { public static DataTable ToPivotTable( - this IEnumerable source, - Func columnSelector, - Expression> rowSelector, - Func, TData> dataSelector) + this IEnumerable source, + Func columnSelector, + Expression> rowSelector, + Func, TData> dataSelector) { DataTable table = new DataTable(); + var rowName = new List(); if (rowSelector.Body is MemberExpression) rowName.Add(((MemberExpression)rowSelector.Body).Member.Name); else rowName.AddRange(((NewExpression)rowSelector.Body).Arguments.Select(it => it as MemberExpression).Select(it => it.Member.Name)); + table.Columns.AddRange(rowName.Select(x => new DataColumn(x)).ToArray()); var columns = source.Select(columnSelector).Distinct(); - - foreach (var column in columns) - table.Columns.Add(new DataColumn(column?.ToString())); + table.Columns.AddRange(columns.Select(x => new DataColumn(x?.ToString())).ToArray()); var rows = source.GroupBy(rowSelector.Compile()) - .Select(rowGroup => new - { - Key = rowGroup.Key, - Values = columns.GroupJoin( - rowGroup, - c => c, - r => columnSelector(r), - (c, columnGroup) => dataSelector(columnGroup)) - }); - - foreach (var row in rows) - { - var dataRow = table.NewRow(); - var items = row.Values.Cast().ToList(); - // 获取匿名对象的动态类型 - var anonymousType = row.Key.GetType(); - - // 获取匿名对象的所有属性 - var properties = anonymousType.GetProperties(); - - for (var i = 0; i < rowName.Count; i++) - { - items.Insert(i, properties[i].GetValue(row.Key, null)); - } - dataRow.ItemArray = items.ToArray(); - table.Rows.Add(dataRow); - } + .Select(rowGroup => + { + var anonymousType = rowGroup.Key.GetType(); + var properties = anonymousType.GetProperties(); + var row = table.NewRow(); + columns.GroupJoin(rowGroup, c => c, r => columnSelector(r), + (c, columnGroup) => + { + var dic = new Dictionary(); + if (c != null) + dic[c.ToString()] = dataSelector(columnGroup); + return dic; + }) + .SelectMany(x => x) + .Select(x => row[x.Key] = x.Value) + .SelectMany(x => properties, (x, y) => row[y.Name] = y.GetValue(rowGroup.Key, null)) + .ToArray(); + table.Rows.Add(row); + return row; + } + ).ToList(); return table; } - public static List ToPivotList( - this IEnumerable source, - Func columnSelector, - Expression> rowSelector, - Func, TData> dataSelector) + public static IEnumerable ToPivotList( + this IEnumerable source, + Func columnSelector, + Expression> rowSelector, + Func, TData> dataSelector) { - var arr = new List(); - var cols = new List(); var rowName = new List(); if (rowSelector.Body is MemberExpression) rowName.Add(((MemberExpression)rowSelector.Body).Member.Name); @@ -82,47 +72,27 @@ namespace SqlSugar var columns = source.Select(columnSelector).Distinct(); - cols = rowName.Concat(columns.Select(x => x?.ToString())).ToList(); - var rows = source.GroupBy(rowSelector.Compile()) - .Select(rowGroup => new - { - Key = rowGroup.Key, - Values = columns.GroupJoin( - rowGroup, - c => c, - r => columnSelector(r), - (c, columnGroup) => dataSelector(columnGroup)) - }); - - foreach (var row in rows) - { - var items = row.Values.Cast().ToList(); - - // 获取匿名对象的动态类型 - var anonymousType = row.Key.GetType(); - - // 获取匿名对象的所有属性 - var properties = anonymousType.GetProperties(); - - for (var i = 0; i < rowName.Count; i++) + .Select(rowGroup => { - items.Insert(i, properties[i].GetValue(row.Key, null)); - } - var obj = GetAnonymousObject(cols, items); - arr.Add(obj); - } - return arr; - } - private static dynamic GetAnonymousObject(IEnumerable columns, IEnumerable values) - { - IDictionary eo = new ExpandoObject() as IDictionary; - int i; - for (i = 0; i < columns.Count(); i++) - { - eo.Add(columns.ElementAt(i), values.ElementAt(i)); - } - return eo; + var anonymousType = rowGroup.Key.GetType(); + var properties = anonymousType.GetProperties(); + IDictionary row = new ExpandoObject(); + columns.GroupJoin(rowGroup, c => c, r => columnSelector(r), + (c, columnGroup) => + { + IDictionary dic = new ExpandoObject(); + if (c != null) + dic[c.ToString()] = dataSelector(columnGroup); + return dic; + }) + .SelectMany(x => x) + .Select(x => row[x.Key] = x.Value) + .SelectMany(x => properties, (x, y) => row[y.Name] = y.GetValue(rowGroup.Key, null)) + .ToList(); + return row; + }); + return rows; } } }