diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs index 6a768543..5b67eff0 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs @@ -821,7 +821,6 @@ namespace FreeSql.Tests.MySqlConnector { b.Key, cou = b.Count(), - sum = b.Sum(b.Key), sum2 = b.Sum(b.Value.TypeGuid) }); var aggtolist1 = select @@ -830,7 +829,14 @@ namespace FreeSql.Tests.MySqlConnector { b.Key, cou = b.Count(), - sum = b.Sum(b.Key), + sum2 = b.Sum(b.Value.TypeGuid) + }); + var aggtolist11 = select + .GroupBy(a => a.Title) + .ToDictionary(b => new + { + b.Key, + cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); @@ -842,7 +848,6 @@ namespace FreeSql.Tests.MySqlConnector b.Key.yyyy, cou = b.Count(), - sum = b.Sum(b.Key.yyyy), sum2 = b.Sum(b.Value.TypeGuid) }); var aggtolist2 = select @@ -853,7 +858,16 @@ namespace FreeSql.Tests.MySqlConnector b.Key.yyyy, cou = b.Count(), - sum = b.Sum(b.Key.yyyy), + sum2 = b.Sum(b.Value.TypeGuid) + }); + var aggtolist22 = select + .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) + .ToDictionary(b => new + { + b.Key.Title, + b.Key.yyyy, + + cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); @@ -863,7 +877,6 @@ namespace FreeSql.Tests.MySqlConnector { b.Key, cou = b.Count(), - sum = b.Sum(b.Key), sum2 = b.Sum(b.Value.TypeGuid), sum3 = b.Sum(b.Value.Type.Parent.Id) }); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs index 2a444d8e..ea7b538e 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs @@ -749,7 +749,6 @@ namespace FreeSql.Tests.Odbc.Dameng { b.Key, cou = b.Count(), - sum = b.Sum(b.Key), sum2 = b.Sum(b.Value.TypeGuid) }); var aggtolist1 = select @@ -760,6 +759,14 @@ namespace FreeSql.Tests.Odbc.Dameng cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); + var aggtolist11 = select + .GroupBy(a => a.Title) + .ToDictionary(b => new + { + b.Key, + cou = b.Count(), + sum2 = b.Sum(b.Value.TypeGuid) + }); var aggsql2 = select .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) @@ -780,6 +787,16 @@ namespace FreeSql.Tests.Odbc.Dameng cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); + var aggtolist22 = select + .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) + .ToDictionary(b => new + { + b.Key.Title, + b.Key.yyyy, + + cou = b.Count(), + sum2 = b.Sum(b.Value.TypeGuid) + }); var aggsql3 = select .GroupBy(a => a.Title) diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs index bd446fcf..c0a0a23e 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs @@ -749,6 +749,14 @@ namespace FreeSql.Tests.Odbc.Default cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); + var aggtolist11 = select + .GroupBy(a => a.Title) + .ToDictionary(b => new + { + b.Key, + cou = b.Count(), + sum2 = b.Sum(b.Value.TypeGuid) + }); var aggsql2 = select .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) @@ -767,6 +775,16 @@ namespace FreeSql.Tests.Odbc.Default b.Key.Title, b.Key.yyyy, + cou = b.Count(), + sum2 = b.Sum(b.Value.TypeGuid) + }); + var aggtolist22 = select + .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) + .ToDictionary(b => new + { + b.Key.Title, + b.Key.yyyy, + cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs index 67225bac..d72847b8 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs @@ -832,7 +832,6 @@ namespace FreeSql.Tests.Odbc.MySql { b.Key, cou = b.Count(), - sum = b.Sum(b.Key), sum2 = b.Sum(b.Value.TypeGuid) }); var aggtolist1 = select @@ -841,7 +840,14 @@ namespace FreeSql.Tests.Odbc.MySql { b.Key, cou = b.Count(), - sum = b.Sum(b.Key), + sum2 = b.Sum(b.Value.TypeGuid) + }); + var aggtolist11 = select + .GroupBy(a => a.Title) + .ToDictionary(b => new + { + b.Key, + cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); @@ -853,7 +859,6 @@ namespace FreeSql.Tests.Odbc.MySql b.Key.yyyy, cou = b.Count(), - sum = b.Sum(b.Key.yyyy), sum2 = b.Sum(b.Value.TypeGuid) }); var aggtolist2 = select @@ -864,7 +869,16 @@ namespace FreeSql.Tests.Odbc.MySql b.Key.yyyy, cou = b.Count(), - sum = b.Sum(b.Key.yyyy), + sum2 = b.Sum(b.Value.TypeGuid) + }); + var aggtolist22 = select + .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) + .ToDictionary(b => new + { + b.Key.Title, + b.Key.yyyy, + + cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); @@ -874,7 +888,6 @@ namespace FreeSql.Tests.Odbc.MySql { b.Key, cou = b.Count(), - sum = b.Sum(b.Key), sum2 = b.Sum(b.Value.TypeGuid), sum3 = b.Sum(b.Value.Type.Parent.Id) }); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs index 86e20010..e97f991c 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs @@ -759,6 +759,14 @@ namespace FreeSql.Tests.Odbc.Oracle cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); + var aggtolist11 = select + .GroupBy(a => a.Title) + .ToDictionary(b => new + { + b.Key, + cou = b.Count(), + sum2 = b.Sum(b.Value.TypeGuid) + }); var aggsql2 = select .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) @@ -777,6 +785,16 @@ namespace FreeSql.Tests.Odbc.Oracle b.Key.Title, b.Key.yyyy, + cou = b.Count(), + sum2 = b.Sum(b.Value.TypeGuid) + }); + var aggtolist22 = select + .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) + .ToDictionary(b => new + { + b.Key.Title, + b.Key.yyyy, + cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs index 99be779b..3f9b79cf 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs @@ -819,6 +819,14 @@ namespace FreeSql.Tests.Odbc.PostgreSQL cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); + var aggtolist11 = select + .GroupBy(a => a.Title) + .ToDictionary(b => new + { + b.Key, + cou = b.Count(), + sum2 = b.Sum(b.Value.TypeGuid) + }); var aggsql2 = select .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) @@ -837,6 +845,16 @@ namespace FreeSql.Tests.Odbc.PostgreSQL b.Key.Title, b.Key.yyyy, + cou = b.Count(), + sum2 = b.Sum(b.Value.TypeGuid) + }); + var aggtolist22 = select + .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) + .ToDictionary(b => new + { + b.Key.Title, + b.Key.yyyy, + cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs index f1ebb323..701c91a7 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs @@ -714,6 +714,14 @@ namespace FreeSql.Tests.Odbc.SqlServer cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); + var aggtolist11 = select + .GroupBy(a => a.Title) + .ToDictionary(b => new + { + b.Key, + cou = b.Count(), + sum2 = b.Sum(b.Value.TypeGuid) + }); var aggsql2 = select .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) @@ -732,6 +740,16 @@ namespace FreeSql.Tests.Odbc.SqlServer b.Key.Title, b.Key.yyyy, + cou = b.Count(), + sum2 = b.Sum(b.Value.TypeGuid) + }); + var aggtolist22 = select + .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) + .ToDictionary(b => new + { + b.Key.Title, + b.Key.yyyy, + cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); diff --git a/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessSelectTest.cs index 69a32587..7bb03da1 100644 --- a/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessSelectTest.cs @@ -750,6 +750,14 @@ namespace FreeSql.Tests.MsAccess cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); + var aggtolist11 = select + .GroupBy(a => a.Title) + .ToDictionary(b => new + { + b.Key, + cou = b.Count(), + sum2 = b.Sum(b.Value.TypeGuid) + }); var aggsql2 = select .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) @@ -768,6 +776,16 @@ namespace FreeSql.Tests.MsAccess b.Key.Title, b.Key.yyyy, + cou = b.Count(), + sum2 = b.Sum(b.Value.TypeGuid) + }); + var aggtolist22 = select + .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) + .ToDictionary(b => new + { + b.Key.Title, + b.Key.yyyy, + cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs index 054e726c..60f05168 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs @@ -863,7 +863,6 @@ namespace FreeSql.Tests.MySql { b.Key, cou = b.Count(), - sum = b.Sum(b.Key), sum2 = b.Sum(b.Value.TypeGuid) }); var aggtolist1 = select @@ -872,7 +871,14 @@ namespace FreeSql.Tests.MySql { b.Key, cou = b.Count(), - sum = b.Sum(b.Key), + sum2 = b.Sum(b.Value.TypeGuid) + }); + var aggtolist11 = select + .GroupBy(a => a.Title) + .ToDictionary(b => new + { + b.Key, + cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); @@ -884,7 +890,6 @@ namespace FreeSql.Tests.MySql b.Key.yyyy, cou = b.Count(), - sum = b.Sum(b.Key.yyyy), sum2 = b.Sum(b.Value.TypeGuid) }); var aggtolist2 = select @@ -895,7 +900,16 @@ namespace FreeSql.Tests.MySql b.Key.yyyy, cou = b.Count(), - sum = b.Sum(b.Key.yyyy), + sum2 = b.Sum(b.Value.TypeGuid) + }); + var aggtolist22 = select + .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) + .ToDictionary(b => new + { + b.Key.Title, + b.Key.yyyy, + + cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); @@ -905,7 +919,6 @@ namespace FreeSql.Tests.MySql { b.Key, cou = b.Count(), - sum = b.Sum(b.Key), sum2 = b.Sum(b.Value.TypeGuid), sum3 = b.Sum(b.Value.Type.Parent.Id) }); diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs index b15f3539..26aacc73 100644 --- a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs @@ -759,6 +759,14 @@ namespace FreeSql.Tests.Oracle cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); + var aggtolist11 = select + .GroupBy(a => a.Title) + .ToDictionary(b => new + { + b.Key, + cou = b.Count(), + sum2 = b.Sum(b.Value.TypeGuid) + }); var aggsql2 = select .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) @@ -777,6 +785,16 @@ namespace FreeSql.Tests.Oracle b.Key.Title, b.Key.yyyy, + cou = b.Count(), + sum2 = b.Sum(b.Value.TypeGuid) + }); + var aggtolist22 = select + .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) + .ToDictionary(b => new + { + b.Key.Title, + b.Key.yyyy, + cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs index 28f04780..878c0150 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs @@ -836,6 +836,14 @@ namespace FreeSql.Tests.PostgreSQL cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); + var aggtolist11 = select + .GroupBy(a => a.Title) + .ToDictionary(b => new + { + b.Key, + cou = b.Count(), + sum2 = b.Sum(b.Value.TypeGuid) + }); var aggsql2 = select .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) @@ -854,6 +862,16 @@ namespace FreeSql.Tests.PostgreSQL b.Key.Title, b.Key.yyyy, + cou = b.Count(), + sum2 = b.Sum(b.Value.TypeGuid) + }); + var aggtolist22 = select + .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) + .ToDictionary(b => new + { + b.Key.Title, + b.Key.yyyy, + cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs index d8d36c82..6625e85a 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs @@ -763,6 +763,14 @@ namespace FreeSql.Tests.SqlServer cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); + var aggtolist11 = select + .GroupBy(a => a.Title) + .ToDictionary(b => new + { + b.Key, + cou = b.Count(), + sum2 = b.Sum(b.Value.TypeGuid) + }); var aggsql2 = select .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) @@ -781,6 +789,16 @@ namespace FreeSql.Tests.SqlServer b.Key.Title, b.Key.yyyy, + cou = b.Count(), + sum2 = b.Sum(b.Value.TypeGuid) + }); + var aggtolist22 = select + .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) + .ToDictionary(b => new + { + b.Key.Title, + b.Key.yyyy, + cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs index 667f7596..49f7cdb9 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs @@ -701,7 +701,6 @@ namespace FreeSql.Tests.Sqlite { b.Key, cou = b.Count(), - sum = b.Sum(b.Key), sum2 = b.Sum(b.Value.TypeGuid) }); var aggtolist1 = select @@ -710,7 +709,14 @@ namespace FreeSql.Tests.Sqlite { b.Key, cou = b.Count(), - sum = b.Sum(b.Key), + sum2 = b.Sum(b.Value.TypeGuid) + }); + var aggtolist11 = select + .GroupBy(a => a.Title) + .ToDictionary(b => new + { + b.Key, + cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); @@ -722,7 +728,6 @@ namespace FreeSql.Tests.Sqlite b.Key.yyyy, cou = b.Count(), - sum = b.Sum(b.Key.yyyy), sum2 = b.Sum(b.Value.TypeGuid) }); var aggtolist2 = select @@ -733,7 +738,16 @@ namespace FreeSql.Tests.Sqlite b.Key.yyyy, cou = b.Count(), - sum = b.Sum(b.Key.yyyy), + sum2 = b.Sum(b.Value.TypeGuid) + }); + var aggtolist22 = select + .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) + .ToDictionary(b => new + { + b.Key.Title, + b.Key.yyyy, + + cou = b.Count(), sum2 = b.Sum(b.Value.TypeGuid) }); @@ -743,7 +757,6 @@ namespace FreeSql.Tests.Sqlite { b.Key, cou = b.Count(), - sum = b.Sum(b.Key), sum2 = b.Sum(b.Value.TypeGuid), sum3 = b.Sum(b.Value.Type.Parent.Id) }); diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs index ddd934e8..d300dc9c 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs @@ -962,6 +962,29 @@ namespace FreeSql.Tests sum2 = b.Sum(b.Value.TypeGuid) }); + var aggtolist21 = select + .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) + .ToDictionary(b => new + { + b.Key.Title, + b.Key.yyyy, + + cou = b.Count(), + sum = b.Sum(b.Key.yyyy), + sum2 = b.Sum(b.Value.TypeGuid) + }); + var aggtolist22 = select + .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) + .ToDictionaryAsync(b => new + { + b.Key.Title, + b.Key.yyyy, + + cou = b.Count(), + sum = b.Sum(b.Key.yyyy), + sum2 = b.Sum(b.Value.TypeGuid) + }).Result; + var aggsql3 = select .GroupBy(a => a.Title) .ToSql(b => new diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index e808373b..83ccee42 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -2309,6 +2309,137 @@ + + + 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 + + + + + + + + + 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > ?age", new { age = 25 }) + + + + + + + 查询 + + + + + + + 查询,ExecuteArrayAsync("select * from user where age > ?age", new { age = 25 }) + + + + + + + + 查询 + + + + + + + 查询,ExecuteDataSetAsync("select * from user where age > ?age; select 2", new { age = 25 }) + + + + + + + + 查询 + + + + + + + 查询,ExecuteDataTableAsync("select * from user where age > ?age", new { age = 25 }) + + + + + + + + 在【主库】执行 + + + + + + + + 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > ?age", new { age = 25 }) + + + + + + + + 在【主库】执行 + + + + + + + + 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > ?age", new { age = 25 }) + + + + + + + + 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > ?age", new SqlParameter { ParameterName = "age", Value = 25 }) + + + + + + + + + + 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > ?age", new { age = 25 }) + + + + + + + + + 执行SQL返回对象集合,Query<User>("select * from user where age > ?age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) + + + + + + + + + + 执行SQL返回对象集合,Query<User>("select * from user where age > ?age; select * from address", new { age = 25 }) + + + + + + 可自定义解析表达式 @@ -2829,6 +2960,12 @@ 超时 + + + 获取资源 + + + 使用完毕后,归还资源 @@ -2899,6 +3036,12 @@ 资源对象 + + + 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 + + 资源对象 + 归还对象给对象池的时候触发 @@ -3531,167 +3674,4 @@ - - - - - - 使用 or 拼接两个 lambda 表达式 - - - - - - 使用 or 拼接两个 lambda 表达式 - - - true 时生效 - - - - - - 将 lambda 表达式取反 - - - true 时生效 - - - - - 生成类似Mongodb的ObjectId有序、不重复Guid - - - - - - 插入数据 - - - - - - - 插入数据,传入实体 - - - - - - - - 插入数据,传入实体数组 - - - - - - - - 插入数据,传入实体集合 - - - - - - - - 插入数据,传入实体集合 - - - - - - - - 修改数据 - - - - - - - 修改数据,传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 查询数据 - - - - - - - 查询数据,传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 删除数据 - - - - - - - 删除数据,传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 开启事务(不支持异步),60秒未执行完成(可能)被其他线程事务自动提交 - - 事务体 () => {} - - - - 开启事务(不支持异步) - - 超时,未执行完成(可能)被其他线程事务自动提交 - 事务体 () => {} - - - - 开启事务(不支持异步) - - - 事务体 () => {} - 超时,未执行完成(可能)被其他线程事务自动提交 - - - - 数据库访问对象 - - - - - 所有拦截方法都在这里 - - - - - CodeFirst 模式开发相关方法 - - - - - DbFirst 模式开发相关方法 - - - - - 全局过滤设置,可默认附加为 Select/Update/Delete 条件 - - - diff --git a/FreeSql/Interface/Curd/ISelect/ISelect0.cs b/FreeSql/Interface/Curd/ISelect/ISelect0.cs index 80a3ca55..ca52d7c2 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect0.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect0.cs @@ -15,7 +15,7 @@ namespace FreeSql #else Task ToDataTableAsync(string field = null); Task> ToDictionaryAsync(Func keySelector); - Task> ToDictionaryAsync(Func keySelector, Func valueSelector); + Task> ToDictionaryAsync(Func keySelector, Func elementSelector); Task> ToListAsync(bool includeNestedMembers = false); Task> ToListAsync(string field); @@ -60,7 +60,7 @@ namespace FreeSql /// /// Dictionary ToDictionary(Func keySelector); - Dictionary ToDictionary(Func keySelector, Func valueSelector); + Dictionary ToDictionary(Func keySelector, Func elementSelector); /// /// 执行SQL查询,返回 T1 实体所有字段的记录,记录不存在时返回 Count 为 0 的列表 /// 注意: diff --git a/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs b/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs index 9a8cf6fc..7e73a743 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs @@ -13,6 +13,7 @@ namespace FreeSql #else Task CountAsync(); Task> ToListAsync(Expression, TReturn>> select); + Task> ToDictionaryAsync(Expression, TElement>> elementSelector); #endif /// @@ -43,6 +44,7 @@ namespace FreeSql /// 选择列 /// List ToList(Expression, TReturn>> select); + Dictionary ToDictionary(Expression, TElement>> elementSelector); /// /// 【linq to sql】专用方法,不建议直接使用 diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 5f3a6a88..950b1383 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -480,23 +480,23 @@ namespace FreeSql.Internal.CommonProvider } #endregion public Dictionary ToDictionary(Func keySelector) => ToDictionary(keySelector, a => a); - public Dictionary ToDictionary(Func keySelector, Func valueSelector) + public Dictionary ToDictionary(Func keySelector, Func elementSelector) { if (keySelector == null) throw new ArgumentNullException(nameof(keySelector)); - if (valueSelector == null) throw new ArgumentNullException(nameof(valueSelector)); + if (elementSelector == null) throw new ArgumentNullException(nameof(elementSelector)); var af = this.GetAllFieldExpressionTreeLevel2(); var sql = this.ToSql(af.Field); var dbParms = _params.ToArray(); var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); - var ret = new Dictionary(); + var ret = new Dictionary(); Exception exception = null; try { _orm.Ado.ExecuteReader(_connection, _transaction, dr => { var item = af.Read(_orm, dr); - ret.Add(keySelector(item), valueSelector(item)); + ret.Add(keySelector(item), elementSelector(item)); }, CommandType.Text, sql, dbParms); } catch (Exception ex) @@ -509,7 +509,7 @@ namespace FreeSql.Internal.CommonProvider var after = new Aop.CurdAfterEventArgs(before, exception, ret); _orm.Aop.CurdAfterHandler?.Invoke(this, after); } - if (typeof(TValue) == typeof(T1)) _trackToList?.Invoke(ret.Values); + if (typeof(TElement) == typeof(T1)) _trackToList?.Invoke(ret.Values); return ret; } public virtual List ToList(bool includeNestedMembers = false) @@ -1088,9 +1088,10 @@ namespace FreeSql.Internal.CommonProvider var field = new StringBuilder(); var index = -10000; //临时规则,不返回 as1 - _commonExpression.ReadAnonymousField(_tables, field, map, ref index, columns, null, _whereCascadeExpression, true); - this.GroupBy(field.Length > 0 ? field.Remove(0, 2).ToString() : null); - return new SelectGroupingProvider(_orm, this, map, _commonExpression, _tables); + _commonExpression.ReadAnonymousField(_tables, field, map, ref index, columns, null, _whereCascadeExpression, false); //不走 DTO 映射 + var sql = field.ToString(); + this.GroupBy(sql.Length > 0 ? sql.Substring(2) : null); + return new SelectGroupingProvider(_orm, this, map, sql, _commonExpression, _tables); } protected TSelect InternalJoin(Expression exp, SelectTableInfoType joinType) { @@ -1146,7 +1147,7 @@ namespace FreeSql.Internal.CommonProvider var field = new StringBuilder(); var index = 0; - _commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null, _whereCascadeExpression, true); + _commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null, _whereCascadeExpression, false); //不走 DTO 映射 return this.ToListMapReader(new ReadAnonymousTypeAfInfo(map, field.Length > 0 ? field.Remove(0, 2).ToString() : null)).FirstOrDefault(); } @@ -1285,23 +1286,23 @@ namespace FreeSql.Internal.CommonProvider } public Task> ToDictionaryAsync(Func keySelector) => ToDictionaryAsync(keySelector, a => a); - async public Task> ToDictionaryAsync(Func keySelector, Func valueSelector) + async public Task> ToDictionaryAsync(Func keySelector, Func elementSelector) { if (keySelector == null) throw new ArgumentNullException(nameof(keySelector)); - if (valueSelector == null) throw new ArgumentNullException(nameof(valueSelector)); + if (elementSelector == null) throw new ArgumentNullException(nameof(elementSelector)); var af = this.GetAllFieldExpressionTreeLevel2(); var sql = this.ToSql(af.Field); var dbParms = _params.ToArray(); var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); - var ret = new Dictionary(); + var ret = new Dictionary(); Exception exception = null; try { await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => { var item = af.Read(_orm, dr); - ret.Add(keySelector(item), valueSelector(item)); + ret.Add(keySelector(item), elementSelector(item)); return Task.FromResult(false); }, CommandType.Text, sql, dbParms); } @@ -1315,7 +1316,7 @@ namespace FreeSql.Internal.CommonProvider var after = new Aop.CurdAfterEventArgs(before, exception, ret); _orm.Aop.CurdAfterHandler?.Invoke(this, after); } - if (typeof(TValue) == typeof(T1)) _trackToList?.Invoke(ret.Values); + if (typeof(TElement) == typeof(T1)) _trackToList?.Invoke(ret.Values); return ret; } public virtual Task> ToListAsync(bool includeNestedMembers = false) @@ -1426,7 +1427,7 @@ namespace FreeSql.Internal.CommonProvider var field = new StringBuilder(); var index = 0; - _commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null, _whereCascadeExpression, true); + _commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null, _whereCascadeExpression, false); //不走 DTO 映射 return (await this.ToListMapReaderAsync(new ReadAnonymousTypeAfInfo(map, field.Length > 0 ? field.Remove(0, 2).ToString() : null))).FirstOrDefault(); } #endif diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs index 46c642d8..8c2474c4 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs @@ -14,13 +14,15 @@ namespace FreeSql.Internal.CommonProvider internal IFreeSql _orm; internal object _select; internal ReadAnonymousTypeInfo _map; + internal string _field; internal CommonExpression _comonExp; internal List _tables; - public SelectGroupingProvider(IFreeSql orm, object select, ReadAnonymousTypeInfo map, CommonExpression comonExp, List tables) + public SelectGroupingProvider(IFreeSql orm, object select, ReadAnonymousTypeInfo map, string field, CommonExpression comonExp, List tables) { _orm = orm; _select = select; _map = map; + _field = field; _comonExp = comonExp; _tables = tables; } @@ -107,20 +109,33 @@ namespace FreeSql.Internal.CommonProvider return this; } + public List Select(Expression, TReturn>> select) => ToList(select); public List ToList(Expression, TReturn>> select) { var map = new ReadAnonymousTypeInfo(); var field = new StringBuilder(); var index = 0; - _comonExp.ReadAnonymousField(null, field, map, ref index, select, getSelectGroupingMapString, null, true); + _comonExp.ReadAnonymousField(null, field, map, ref index, select, getSelectGroupingMapString, null, false); if (map.Childs.Any() == false && map.MapType == null) map.MapType = typeof(TReturn); var method = _select.GetType().GetMethod("ToListMapReader", BindingFlags.Instance | BindingFlags.NonPublic); method = method.MakeGenericMethod(typeof(TReturn)); return method.Invoke(_select, new object[] { new ReadAnonymousTypeAfInfo(map, field.Length > 0 ? field.Remove(0, 2).ToString() : null) }) as List; } - - public List Select(Expression, TReturn>> select) => ToList(select); + public Dictionary ToDictionary(Expression, TElement>> elementSelector) + { + var map = new ReadAnonymousTypeInfo(); + var field = new StringBuilder(); + var index = 0; + + _comonExp.ReadAnonymousField(null, field, map, ref index, elementSelector, getSelectGroupingMapString, null, false); + if (map.Childs.Any() == false && map.MapType == null) map.MapType = typeof(TElement); + var method = _select.GetType().GetMethod("ToListMapReaderPrivate", BindingFlags.Instance | BindingFlags.NonPublic); + method = method.MakeGenericMethod(typeof(TElement)); + var otherAf = new ReadAnonymousTypeOtherInfo(_field, _map, new List()); + var values = method.Invoke(_select, new object[] { new ReadAnonymousTypeAfInfo(map, field.Length > 0 ? field.Remove(0, 2).ToString() : null), new[] { otherAf } }) as List; + return otherAf.retlist.Select((a, b) => new KeyValuePair((TKey)a, values[b])).ToDictionary(a => a.Key, a => a.Value); + } public string ToSql(Expression, TReturn>> select, FieldAliasOptions fieldAlias = FieldAliasOptions.AsIndex) { @@ -128,7 +143,7 @@ namespace FreeSql.Internal.CommonProvider var field = new StringBuilder(); var index = fieldAlias == FieldAliasOptions.AsProperty ? CommonExpression.ReadAnonymousFieldAsCsName : 0; - _comonExp.ReadAnonymousField(null, field, map, ref index, select, getSelectGroupingMapString, null, true); + _comonExp.ReadAnonymousField(null, field, map, ref index, select, getSelectGroupingMapString, null, false); var method = _select.GetType().GetMethod("ToSql", new[] { typeof(string) }); return method.Invoke(_select, new object[] { field.Length > 0 ? field.Remove(0, 2).ToString() : null }) as string; } @@ -181,12 +196,26 @@ namespace FreeSql.Internal.CommonProvider var field = new StringBuilder(); var index = 0; - _comonExp.ReadAnonymousField(null, field, map, ref index, select, getSelectGroupingMapString, null, true); + _comonExp.ReadAnonymousField(null, field, map, ref index, select, getSelectGroupingMapString, null, false); if (map.Childs.Any() == false && map.MapType == null) map.MapType = typeof(TReturn); var method = _select.GetType().GetMethod("ToListMapReaderAsync", BindingFlags.Instance | BindingFlags.NonPublic); method = method.MakeGenericMethod(typeof(TReturn)); return method.Invoke(_select, new object[] { new ReadAnonymousTypeAfInfo(map, field.Length > 0 ? field.Remove(0, 2).ToString() : null) }) as Task>; } + async public Task> ToDictionaryAsync(Expression, TElement>> elementSelector) + { + var map = new ReadAnonymousTypeInfo(); + var field = new StringBuilder(); + var index = 0; + + _comonExp.ReadAnonymousField(null, field, map, ref index, elementSelector, getSelectGroupingMapString, null, false); + if (map.Childs.Any() == false && map.MapType == null) map.MapType = typeof(TElement); + var method = _select.GetType().GetMethod("ToListMapReaderPrivateAsync", BindingFlags.Instance | BindingFlags.NonPublic); + method = method.MakeGenericMethod(typeof(TElement)); + var otherAf = new ReadAnonymousTypeOtherInfo(_field, _map, new List()); + var values = await (method.Invoke(_select, new object[] { new ReadAnonymousTypeAfInfo(map, field.Length > 0 ? field.Remove(0, 2).ToString() : null), new[] { otherAf } }) as Task>); + return otherAf.retlist.Select((a, b) => new KeyValuePair((TKey)a, values[b])).ToDictionary(a => a.Key, a => a.Value); + } #endif } }