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; } } }