mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-10-15 02:35:04 +08:00
!48 增加异步ToPivotTableAsync、ToPivotListAsync、ToPivotEnumerableAsync和ToPivotJsonAsync
Merge pull request !48 from yanghs/master
This commit is contained in:
@@ -224,13 +224,17 @@ namespace SqlSugar
|
||||
{
|
||||
return this.Context.Utilities.SerializeObject(this.ToPageList(pageIndex, pageSize, ref totalNumber), typeof(T));
|
||||
}
|
||||
|
||||
#region 内存行转列
|
||||
|
||||
#region 同步
|
||||
public virtual DataTable ToPivotTable<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
|
||||
{
|
||||
return this.ToList().ToPivotTable(columnSelector, rowSelector, dataSelector);
|
||||
}
|
||||
public virtual List<dynamic> ToPivotList<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
|
||||
{
|
||||
return ToPivotEnumerable(columnSelector,rowSelector,dataSelector).ToList();
|
||||
return ToPivotEnumerable(columnSelector, rowSelector, dataSelector).ToList();
|
||||
}
|
||||
public virtual IEnumerable<dynamic> ToPivotEnumerable<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
|
||||
{
|
||||
@@ -238,9 +242,33 @@ namespace SqlSugar
|
||||
}
|
||||
public virtual string ToPivotJson<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
|
||||
{
|
||||
var list = this.ToPivotList(columnSelector, rowSelector, dataSelector);
|
||||
var list = ToPivotEnumerable(columnSelector, rowSelector, dataSelector).ToList();
|
||||
return this.Context.Utilities.SerializeObject(list);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 异步
|
||||
public virtual async Task<DataTable> ToPivotTableAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
|
||||
{
|
||||
return (await this.ToListAsync()).ToPivotTable(columnSelector, rowSelector, dataSelector);
|
||||
}
|
||||
public virtual async Task<List<dynamic>> ToPivotListAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
|
||||
{
|
||||
return (await ToPivotEnumerableAsync(columnSelector, rowSelector, dataSelector)).ToList();
|
||||
}
|
||||
public virtual async Task<IEnumerable<dynamic>> ToPivotEnumerableAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
|
||||
{
|
||||
return (await this.ToListAsync()).ToPivotList(columnSelector, rowSelector, dataSelector);
|
||||
}
|
||||
public virtual async Task<string> ToPivotJsonAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
|
||||
{
|
||||
var list = (await ToPivotEnumerableAsync(columnSelector, rowSelector, dataSelector)).ToList();
|
||||
return this.Context.Utilities.SerializeObject(list);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
public List<T> ToChildList(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue, bool isContainOneself = true)
|
||||
{
|
||||
var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
|
||||
|
@@ -285,10 +285,25 @@ namespace SqlSugar
|
||||
void AddQueue();
|
||||
ISugarQueryable<T> IgnoreColumns(Expression<Func<T, object>> columns);
|
||||
ISugarQueryable<T> IgnoreColumns(params string[] columns);
|
||||
DataTable ToPivotTable<TColumn, TRow, TData>(Func<T, TColumn> columnSelector,Expression<Func<T, TRow>> rowSelector,Func<IEnumerable<T>, TData> dataSelector);
|
||||
|
||||
#region 内存行转列
|
||||
|
||||
#region 同步
|
||||
DataTable ToPivotTable<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector);
|
||||
List<dynamic> ToPivotList<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector);
|
||||
IEnumerable<dynamic> ToPivotEnumerable<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector);
|
||||
string ToPivotJson<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector);
|
||||
#endregion
|
||||
|
||||
#region 异步
|
||||
Task<DataTable> ToPivotTableAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector);
|
||||
Task<List<dynamic>> ToPivotListAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector);
|
||||
Task<IEnumerable<dynamic>> ToPivotEnumerableAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector);
|
||||
Task<string> ToPivotJsonAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector);
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
ISugarQueryable<T> SplitTable(Func<List<SplitTableInfo>,IEnumerable<SplitTableInfo>> getTableNamesFunc);
|
||||
ISugarQueryable<T> SplitTable(DateTime beginTime,DateTime endTime);
|
||||
ISugarQueryable<T> SplitTable();
|
||||
|
@@ -22,6 +22,10 @@ namespace MySqlTest
|
||||
db.CodeFirst.SetStringDefaultLength(200).InitTables(typeof(RowToColumn));
|
||||
Clean();
|
||||
InitData();
|
||||
Test1();
|
||||
Test2();
|
||||
Test3();
|
||||
Test4();
|
||||
Test5();
|
||||
Test6();
|
||||
}
|
||||
@@ -66,7 +70,86 @@ namespace MySqlTest
|
||||
var db = DbHelper.GetNewDb();
|
||||
db.DbMaintenance.TruncateTable<RowToColumn>();
|
||||
}
|
||||
public static void Test1()
|
||||
{
|
||||
var db = DbHelper.GetNewDb();
|
||||
// 创建 Stopwatch 对象并开始计时
|
||||
Stopwatch stopwatch = new Stopwatch();
|
||||
stopwatch.Start();
|
||||
var s = new DateTime(2023, 2, 1);
|
||||
var e = new DateTime(2023, 6, 1).AddMilliseconds(-1);
|
||||
var ls = db.Queryable<RowToColumn>()
|
||||
.Where(x => x.Date >= s && x.Date <= e)
|
||||
.GroupBy(x => new { x.Code, x.Date, x.Val, x.T1, x.T2 })
|
||||
.Select(x => new { x.Code, x.Date, x.T1, x.T2, Val = SqlFunc.AggregateSum(x.Val) })//求和可以自动处理空值
|
||||
.ToPivotTable(it => it.Code, it => it.T1, it => it.Any() ? it.Sum(x => x.Val) : 0);
|
||||
|
||||
// 结束计时并获取经过的时间
|
||||
stopwatch.Stop();
|
||||
TimeSpan elapsedTime = stopwatch.Elapsed;
|
||||
|
||||
Console.WriteLine("T1:" + elapsedTime);
|
||||
}
|
||||
public static void Test2()
|
||||
{
|
||||
var db = DbHelper.GetNewDb();
|
||||
// 创建 Stopwatch 对象并开始计时
|
||||
Stopwatch stopwatch = new Stopwatch();
|
||||
stopwatch.Start();
|
||||
var s = new DateTime(2023, 2, 1);
|
||||
var e = new DateTime(2023, 6, 1).AddMilliseconds(-1);
|
||||
var ls = db.Queryable<RowToColumn>()
|
||||
.Where(x => x.Date >= s && x.Date <= e)
|
||||
.GroupBy(x => new { x.Code, x.Date, x.Val, x.T1, x.T2 })
|
||||
.Select(x => new { x.Code, x.Date, x.T1, x.T2, Val = SqlFunc.AggregateSum(x.Val) })//求和可以自动处理空值
|
||||
.ToPivotList(it => it.Code, it => it.T1, it => it.Any() ? it.Sum(x => x.Val) : 0);
|
||||
|
||||
// 结束计时并获取经过的时间
|
||||
stopwatch.Stop();
|
||||
TimeSpan elapsedTime = stopwatch.Elapsed;
|
||||
|
||||
Console.WriteLine("T2:" + elapsedTime);
|
||||
}
|
||||
public static void Test3()
|
||||
{
|
||||
var db = DbHelper.GetNewDb();
|
||||
// 创建 Stopwatch 对象并开始计时
|
||||
Stopwatch stopwatch = new Stopwatch();
|
||||
stopwatch.Start();
|
||||
var s = new DateTime(2023, 2, 1);
|
||||
var e = new DateTime(2023, 6, 1).AddMilliseconds(-1);
|
||||
var ls = db.Queryable<RowToColumn>()
|
||||
.Where(x => x.Date >= s && x.Date <= e)
|
||||
.GroupBy(x => new { x.Code, x.Date, x.Val, x.T1, x.T2 })
|
||||
.Select(x => new { x.Code, x.Date, x.T1, x.T2, Val = SqlFunc.AggregateSum(x.Val) })//求和可以自动处理空值
|
||||
.ToPivotTable(it => it.Code, it => it.Date, it => it.Any() ? it.Sum(x => x.Val) : 0);
|
||||
|
||||
// 结束计时并获取经过的时间
|
||||
stopwatch.Stop();
|
||||
TimeSpan elapsedTime = stopwatch.Elapsed;
|
||||
|
||||
Console.WriteLine("T3:" + elapsedTime);
|
||||
}
|
||||
public static void Test4()
|
||||
{
|
||||
var db = DbHelper.GetNewDb();
|
||||
// 创建 Stopwatch 对象并开始计时
|
||||
Stopwatch stopwatch = new Stopwatch();
|
||||
stopwatch.Start();
|
||||
var s = new DateTime(2023, 2, 1);
|
||||
var e = new DateTime(2023, 6, 1).AddMilliseconds(-1);
|
||||
var ls = db.Queryable<RowToColumn>()
|
||||
.Where(x => x.Date >= s && x.Date <= e)
|
||||
.GroupBy(x => new { x.Code, x.Date, x.Val, x.T1, x.T2 })
|
||||
.Select(x => new { x.Code, x.Date, x.T1, x.T2, Val = SqlFunc.AggregateSum(x.Val) })//求和可以自动处理空值
|
||||
.ToPivotList(it => it.Code, it => it.Date, it => it.Any() ? it.Sum(x => x.Val) : 0);
|
||||
|
||||
// 结束计时并获取经过的时间
|
||||
stopwatch.Stop();
|
||||
TimeSpan elapsedTime = stopwatch.Elapsed;
|
||||
|
||||
Console.WriteLine("T4:" + elapsedTime);
|
||||
}
|
||||
public static void Test5()
|
||||
{
|
||||
var db = DbHelper.GetNewDb();
|
||||
@@ -105,7 +188,7 @@ namespace MySqlTest
|
||||
stopwatch.Stop();
|
||||
TimeSpan elapsedTime = stopwatch.Elapsed;
|
||||
|
||||
Console.WriteLine("T000:" + elapsedTime);
|
||||
Console.WriteLine("T6:" + elapsedTime);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -224,13 +224,17 @@ namespace SqlSugar
|
||||
{
|
||||
return this.Context.Utilities.SerializeObject(this.ToPageList(pageIndex, pageSize, ref totalNumber), typeof(T));
|
||||
}
|
||||
|
||||
#region 内存行转列
|
||||
|
||||
#region 同步
|
||||
public virtual DataTable ToPivotTable<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
|
||||
{
|
||||
return this.ToList().ToPivotTable(columnSelector, rowSelector, dataSelector);
|
||||
}
|
||||
public virtual List<dynamic> ToPivotList<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
|
||||
{
|
||||
return ToPivotEnumerable(columnSelector,rowSelector,dataSelector).ToList();
|
||||
return ToPivotEnumerable(columnSelector, rowSelector, dataSelector).ToList();
|
||||
}
|
||||
public virtual IEnumerable<dynamic> ToPivotEnumerable<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
|
||||
{
|
||||
@@ -238,9 +242,33 @@ namespace SqlSugar
|
||||
}
|
||||
public virtual string ToPivotJson<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
|
||||
{
|
||||
var list = this.ToPivotList(columnSelector, rowSelector, dataSelector);
|
||||
var list = ToPivotEnumerable(columnSelector, rowSelector, dataSelector).ToList();
|
||||
return this.Context.Utilities.SerializeObject(list);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 异步
|
||||
public virtual async Task<DataTable> ToPivotTableAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
|
||||
{
|
||||
return (await this.ToListAsync()).ToPivotTable(columnSelector, rowSelector, dataSelector);
|
||||
}
|
||||
public virtual async Task<List<dynamic>> ToPivotListAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
|
||||
{
|
||||
return (await ToPivotEnumerableAsync(columnSelector, rowSelector, dataSelector)).ToList();
|
||||
}
|
||||
public virtual async Task<IEnumerable<dynamic>> ToPivotEnumerableAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
|
||||
{
|
||||
return (await this.ToListAsync()).ToPivotList(columnSelector, rowSelector, dataSelector);
|
||||
}
|
||||
public virtual async Task<string> ToPivotJsonAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
|
||||
{
|
||||
var list = (await ToPivotEnumerableAsync(columnSelector, rowSelector, dataSelector)).ToList();
|
||||
return this.Context.Utilities.SerializeObject(list);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
public List<T> ToChildList(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue, bool isContainOneself = true)
|
||||
{
|
||||
var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
|
||||
|
@@ -285,10 +285,25 @@ namespace SqlSugar
|
||||
void AddQueue();
|
||||
ISugarQueryable<T> IgnoreColumns(Expression<Func<T, object>> columns);
|
||||
ISugarQueryable<T> IgnoreColumns(params string[] columns);
|
||||
DataTable ToPivotTable<TColumn, TRow, TData>(Func<T, TColumn> columnSelector,Expression<Func<T, TRow>> rowSelector,Func<IEnumerable<T>, TData> dataSelector);
|
||||
|
||||
#region 内存行转列
|
||||
|
||||
#region 同步
|
||||
DataTable ToPivotTable<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector);
|
||||
List<dynamic> ToPivotList<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector);
|
||||
IEnumerable<dynamic> ToPivotEnumerable<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector);
|
||||
string ToPivotJson<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector);
|
||||
#endregion
|
||||
|
||||
#region 异步
|
||||
Task<DataTable> ToPivotTableAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector);
|
||||
Task<List<dynamic>> ToPivotListAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector);
|
||||
Task<IEnumerable<dynamic>> ToPivotEnumerableAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector);
|
||||
Task<string> ToPivotJsonAsync<TColumn, TRow, TData>(Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector);
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
ISugarQueryable<T> SplitTable(Func<List<SplitTableInfo>,IEnumerable<SplitTableInfo>> getTableNamesFunc);
|
||||
ISugarQueryable<T> SplitTable(DateTime beginTime,DateTime endTime);
|
||||
ISugarQueryable<T> SplitTable();
|
||||
|
Reference in New Issue
Block a user