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();