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 c0936140..d2f84e9a 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs @@ -722,6 +722,7 @@ namespace FreeSql.Tests.MySqlConnector .OrderByDescending(a => a.Count()) .Offset(10) .Limit(2) + .Count(out var trycount) .ToList(a => new { a.Key.tt2, 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 bd34ae44..c318cb2c 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs @@ -648,6 +648,7 @@ namespace FreeSql.Tests.Odbc.Dameng .OrderByDescending(a => a.Count()) .Offset(10) .Limit(2) + .Count(out var trycount) .ToList(a => new { a.Key.tt2, 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 f5ddd317..3eb5ced3 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs @@ -639,6 +639,7 @@ namespace FreeSql.Tests.Odbc.Default .OrderBy(a => a.Key.tt2) .OrderByDescending(a => a.Count()) .Limit(2) + .Count(out var trycount) .ToList(a => new { a.Key.tt2, 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 55b667ea..d8a227b4 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs @@ -732,6 +732,7 @@ namespace FreeSql.Tests.Odbc.MySql .OrderByDescending(a => a.Count()) .Offset(10) .Limit(2) + .Count(out var trycount) .ToList(a => new { a.Key.tt2, 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 98e1c28d..40a4862c 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs @@ -648,6 +648,7 @@ namespace FreeSql.Tests.Odbc.Oracle .OrderByDescending(a => a.Count()) .Offset(10) .Limit(2) + .Count(out var trycount) .ToList(a => new { a.Key.tt2, 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 d1c0da01..e04ee009 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs @@ -710,6 +710,7 @@ namespace FreeSql.Tests.Odbc.PostgreSQL .OrderByDescending(a => a.Count()) .Offset(10) .Limit(2) + .Count(out var trycount) .ToList(a => new { a.Key.tt2, 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 4b7f5448..dafc6f17 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs @@ -604,6 +604,7 @@ namespace FreeSql.Tests.Odbc.SqlServer .OrderByDescending(a => a.Count()) .Offset(10) .Limit(2) + .Count(out var trycount) .ToList(a => new { a.Key.tt2, diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs index 43db97cc..c76fea46 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs @@ -763,6 +763,7 @@ namespace FreeSql.Tests.MySql .OrderByDescending(a => a.Count()) .Offset(10) .Limit(2) + .Count(out var trycount) .ToList(a => new { a.Key.tt2, diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs index 9eb3b48b..39c678ba 100644 --- a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs @@ -648,6 +648,7 @@ namespace FreeSql.Tests.Oracle .OrderByDescending(a => a.Count()) .Offset(10) .Limit(2) + .Count(out var trycount) .ToList(a => new { a.Key.tt2, diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs index 7ee59d6b..117aa2f8 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs @@ -727,6 +727,7 @@ namespace FreeSql.Tests.PostgreSQL .OrderByDescending(a => a.Count()) .Offset(10) .Limit(2) + .Count(out var trycount) .ToList(a => new { a.Key.tt2, diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs index 8e318e6b..ddcfa963 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs @@ -652,6 +652,7 @@ namespace FreeSql.Tests.SqlServer .OrderByDescending(a => a.Count()) .Offset(10) .Limit(2) + .Count(out var trycount) .ToList(a => new { a.Key.tt2, diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs index 4b243edc..657caa7d 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs @@ -601,6 +601,7 @@ namespace FreeSql.Tests.Sqlite .OrderByDescending(a => a.Count()) .Offset(10) .Limit(2) + .Count(out var trycount) .ToList(a => new { a.Key.tt2, diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 5a5f4b82..f20e9ab4 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1776,6 +1776,19 @@ 每页多少 + + + 查询的记录数量 + + + + + + 查询的记录数量,以参数out形式返回 + + 返回的变量 + + 分组的数据 diff --git a/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs b/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs index 7cfb0f7e..3ba8b71b 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs @@ -11,6 +11,7 @@ namespace FreeSql #if net40 #else + Task CountAsync(); Task> ToListAsync(Expression, TReturn>> select); #endif @@ -95,6 +96,18 @@ namespace FreeSql /// 每页多少 /// ISelectGrouping Page(int pageNumber, int pageSize); + + /// + /// 查询的记录数量 + /// + /// + long Count(); + /// + /// 查询的记录数量,以参数out形式返回 + /// + /// 返回的变量 + /// + ISelectGrouping Count(out long count); } public interface ISelectGroupingAggregate diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 238a0285..0a36fad7 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -1052,7 +1052,7 @@ namespace FreeSql.Internal.CommonProvider _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(this, map, _commonExpression, _tables); + return new SelectGroupingProvider(_orm, this, map, _commonExpression, _tables); } protected TSelect InternalJoin(Expression exp, SelectTableInfoType joinType) { diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs index 78ac4bcc..e9bd0947 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs @@ -11,13 +11,14 @@ namespace FreeSql.Internal.CommonProvider { public class SelectGroupingProvider : ISelectGrouping { - + internal IFreeSql _orm; internal object _select; internal ReadAnonymousTypeInfo _map; internal CommonExpression _comonExp; internal List _tables; - public SelectGroupingProvider(object select, ReadAnonymousTypeInfo map, CommonExpression comonExp, List tables) + public SelectGroupingProvider(IFreeSql orm, object select, ReadAnonymousTypeInfo map, CommonExpression comonExp, List tables) { + _orm = orm; _select = select; _map = map; _comonExp = comonExp; @@ -162,8 +163,17 @@ namespace FreeSql.Internal.CommonProvider return this; } + public long Count() => long.TryParse(string.Concat(_orm.Ado.ExecuteScalar($"select count(1) from ({this.ToSql("1 as1")}) fta")), out var trylng) ? trylng : default(long); + public ISelectGrouping Count(out long count) + { + count = this.Count(); + return this; + } + #if net40 #else + async public Task CountAsync() => long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync($"select count(1) from ({this.ToSql("1 as1")}) fta")), out var trylng) ? trylng : default(long); + public Task> ToListAsync(Expression, TReturn>> select) { var map = new ReadAnonymousTypeInfo();