解决.ToPivotTable(it => it.day, it =>new{ it.name}, it => it.Sum(x => x.count))的几个问题

1 it.name 为空值时抛出异常索引超出界值异常
2 当it.name 的值中 有"T0 = T1 = T2"类似情况是会截断字符串,显示为"T0"
3 提升转化效率,现在所花时间只需要之前的1/4左右
This commit is contained in:
YHS 2024-01-05 11:19:55 +08:00
parent 079abab4e5
commit 467020a04a

View File

@ -8,7 +8,7 @@ using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace SqlSugar namespace SqlSugar
{ {
internal static class DataTableExtensions internal static class DataTableExtensions
{ {
@ -19,12 +19,13 @@ namespace SqlSugar
Func<IEnumerable<T>, TData> dataSelector) Func<IEnumerable<T>, TData> dataSelector)
{ {
DataTable table = new DataTable(); DataTable table = new DataTable();
var rowName = ""; var rowName = new List<string>();
if (rowSelector.Body is MemberExpression) if (rowSelector.Body is MemberExpression)
rowName = ((MemberExpression)rowSelector.Body).Member.Name; rowName.Add(((MemberExpression)rowSelector.Body).Member.Name);
else else
rowName =string.Join(UtilConstants.ReplaceKey, ((NewExpression)rowSelector.Body).Arguments.Select(it=>it as MemberExpression).Select(it=>it.Member.Name)); rowName.AddRange(((NewExpression)rowSelector.Body).Arguments.Select(it => it as MemberExpression).Select(it => it.Member.Name));
table.Columns.Add(new DataColumn(rowName));
table.Columns.AddRange(rowName.Select(x => new DataColumn(x)).ToArray());
var columns = source.Select(columnSelector).Distinct(); var columns = source.Select(columnSelector).Distinct();
foreach (var column in columns) foreach (var column in columns)
@ -45,36 +46,23 @@ namespace SqlSugar
{ {
var dataRow = table.NewRow(); var dataRow = table.NewRow();
var items = row.Values.Cast<object>().ToList(); var items = row.Values.Cast<object>().ToList();
items.Insert(0, row.Key); // 获取匿名对象的动态类型
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(); dataRow.ItemArray = items.ToArray();
table.Rows.Add(dataRow); table.Rows.Add(dataRow);
} }
var firstName = table.Columns[0]?.ColumnName;
if (firstName.ObjToString().Contains(UtilConstants.ReplaceKey))
{
int i = 0;
foreach (var item in Regex.Split(firstName,UtilConstants.ReplaceKey))
{
i++;
table.Columns.Add(item);
table.Columns[item].SetOrdinal(i);
}
foreach (DataRow row in table.Rows)
{
var json =row[firstName];
var list = json.ToString().TrimStart('{', ' ').TrimEnd('}', ' ')
.Split(new[] { ", " }, StringSplitOptions.None)
.Select(it => it.Split(new[] { " = " }, StringSplitOptions.None)).ToList();
foreach (var item in Regex.Split(firstName, UtilConstants.ReplaceKey))
{
var x = list.First(it => it.First().Trim() == item.Trim());
row[item] =x[1] ;
}
}
table.Columns.Remove(firstName);
}
return table; return table;
} }
public static List<dynamic> ToPivotList<T, TColumn, TRow, TData>( public static List<dynamic> ToPivotList<T, TColumn, TRow, TData>(
this IEnumerable<T> source, this IEnumerable<T> source,
Func<T, TColumn> columnSelector, Func<T, TColumn> columnSelector,
@ -82,17 +70,17 @@ namespace SqlSugar
Func<IEnumerable<T>, TData> dataSelector) Func<IEnumerable<T>, TData> dataSelector)
{ {
var arr = new List<object>(); var arr = new List<dynamic>();
var cols = new List<string>(); var cols = new List<string>();
var rowName = ""; var rowName = new List<string>();
if (rowSelector.Body is MemberExpression) if (rowSelector.Body is MemberExpression)
rowName = ((MemberExpression)rowSelector.Body).Member.Name; rowName.Add(((MemberExpression)rowSelector.Body).Member.Name);
else else
rowName = "Group_"+string.Join("_", ((NewExpression)rowSelector.Body).Arguments.Select(it => it as MemberExpression).Select(it => it.Member.Name)); rowName.AddRange(((NewExpression)rowSelector.Body).Arguments.Select(it => it as MemberExpression).Select(it => it.Member.Name));
var columns = source.Select(columnSelector).Distinct(); var columns = source.Select(columnSelector).Distinct();
cols = (new[] { rowName }).Concat(columns.Select(x => x?.ToString())).ToList(); cols = rowName.Concat(columns.Select(x => x?.ToString())).ToList();
var rows = source.GroupBy(rowSelector.Compile()) var rows = source.GroupBy(rowSelector.Compile())
.Select(rowGroup => new .Select(rowGroup => new
@ -103,17 +91,26 @@ namespace SqlSugar
c => c, c => c,
r => columnSelector(r), r => columnSelector(r),
(c, columnGroup) => dataSelector(columnGroup)) (c, columnGroup) => dataSelector(columnGroup))
}).ToList(); });
foreach (var row in rows) foreach (var row in rows)
{ {
var items = row.Values.Cast<object>().ToList(); var items = row.Values.Cast<object>().ToList();
items.Insert(0, row.Key);
// 获取匿名对象的动态类型
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));
}
var obj = GetAnonymousObject(cols, items); var obj = GetAnonymousObject(cols, items);
arr.Add(obj); arr.Add(obj);
} }
return arr.ToList(); return arr;
} }
private static dynamic GetAnonymousObject(IEnumerable<string> columns, IEnumerable<object> values) private static dynamic GetAnonymousObject(IEnumerable<string> columns, IEnumerable<object> values)
{ {