diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index 5a0c8bd0..9c6cd88b 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -130,6 +130,13 @@
清空状态数据
+
+
+ 根据 lambda 条件删除数据
+
+
+
+
添加
diff --git a/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengSelectTest.cs
index 40d64009..3eefc1ef 100644
--- a/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengSelectTest.cs
@@ -812,6 +812,10 @@ namespace FreeSql.Tests.Dameng
public void ToAggregate()
{
var sql = select.ToAggregate(a => new { sum = a.Sum(a.Key.Id + 11.11), avg = a.Avg(a.Key.Id), count = a.Count(), max = a.Max(a.Key.Id), min = a.Min(a.Key.Id) });
+
+ select
+ .Aggregate(a => new { sum = a.Sum(a.Key.Id), count = a.Count() }, out var output)
+ .ToList();
}
[Fact]
public void OrderBy()
diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs
index 2dec40eb..dcfab4da 100644
--- a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs
+++ b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs
@@ -231,8 +231,6 @@ namespace FreeSql.Tests
Id = a.Key,
EdiId1 = SqlExt.Max(a.Key).Over().PartitionBy(new { a.Value.EdiId, a.Value.Id }).OrderByDescending(new { a.Value.EdiId, a.Value.Id }).ToValue(),
EdiId2 = SqlExt.Max(a.Key).Over().PartitionBy(a.Value.EdiId).OrderByDescending(a.Value.Id).ToValue(),
-
- Sub1 = g.sqlserver.Select().Where(b => b.Id == a.Key).Count()
});
var sqlextGroupConcat = g.mysql.Select()
diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml
index 983c8c85..030132d4 100644
--- a/FreeSql/FreeSql.xml
+++ b/FreeSql/FreeSql.xml
@@ -2032,6 +2032,18 @@
+
+
+ 执行SQL查询,返回指定字段的聚合结果给 output 参数
+ fsql.Select<T>()
+ .Aggregate(a => new { count = a.Count, sum = a.Sum(a.Key.Price) }, out var agg)
+ .Page(1, 10).ToList();
+
+
+
+
+
+
求和
diff --git a/FreeSql/Interface/Curd/ISelect/ISelect1.cs b/FreeSql/Interface/Curd/ISelect/ISelect1.cs
index 96daf821..fd7a814c 100644
--- a/FreeSql/Interface/Curd/ISelect/ISelect1.cs
+++ b/FreeSql/Interface/Curd/ISelect/ISelect1.cs
@@ -110,6 +110,17 @@ namespace FreeSql
///
///
TReturn ToAggregate(Expression, TReturn>> select);
+ ///
+ /// 执行SQL查询,返回指定字段的聚合结果给 output 参数
+ /// fsql.Select<T>()
+ /// .Aggregate(a => new { count = a.Count, sum = a.Sum(a.Key.Price) }, out var agg)
+ /// .Page(1, 10).ToList();
+ ///
+ ///
+ ///
+ ///
+ ///
+ ISelect Aggregate(Expression, TReturn>> select, out TReturn result);
///
/// 求和
diff --git a/FreeSql/Interface/Curd/ISelect/ISelect10.cs b/FreeSql/Interface/Curd/ISelect/ISelect10.cs
index 1acf96da..f35462e6 100644
--- a/FreeSql/Interface/Curd/ISelect/ISelect10.cs
+++ b/FreeSql/Interface/Curd/ISelect/ISelect10.cs
@@ -40,6 +40,7 @@ namespace FreeSql
string ToSql(Expression> select, FieldAliasOptions fieldAlias = FieldAliasOptions.AsIndex);
TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select);
+ ISelect Aggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select, out TReturn result);
decimal Sum(Expression> column);
TMember Min(Expression> column);
TMember Max(Expression> column);
diff --git a/FreeSql/Interface/Curd/ISelect/ISelect2.cs b/FreeSql/Interface/Curd/ISelect/ISelect2.cs
index 6bcdaac6..a6aeaa28 100644
--- a/FreeSql/Interface/Curd/ISelect/ISelect2.cs
+++ b/FreeSql/Interface/Curd/ISelect/ISelect2.cs
@@ -40,6 +40,7 @@ namespace FreeSql
string ToSql(Expression> select, FieldAliasOptions fieldAlias = FieldAliasOptions.AsIndex);
TReturn ToAggregate(Expression, ISelectGroupingAggregate, TReturn>> select);
+ ISelect Aggregate(Expression, ISelectGroupingAggregate, TReturn>> select, out TReturn result);
decimal Sum(Expression> column);
TMember Min(Expression> column);
TMember Max(Expression> column);
diff --git a/FreeSql/Interface/Curd/ISelect/ISelect3.cs b/FreeSql/Interface/Curd/ISelect/ISelect3.cs
index ea441d28..35a6212a 100644
--- a/FreeSql/Interface/Curd/ISelect/ISelect3.cs
+++ b/FreeSql/Interface/Curd/ISelect/ISelect3.cs
@@ -40,6 +40,7 @@ namespace FreeSql
string ToSql(Expression> select, FieldAliasOptions fieldAlias = FieldAliasOptions.AsIndex);
TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select);
+ ISelect Aggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select, out TReturn result);
decimal Sum(Expression> column);
TMember Min(Expression> column);
TMember Max(Expression> column);
diff --git a/FreeSql/Interface/Curd/ISelect/ISelect4.cs b/FreeSql/Interface/Curd/ISelect/ISelect4.cs
index 28e2c5f1..93c6f809 100644
--- a/FreeSql/Interface/Curd/ISelect/ISelect4.cs
+++ b/FreeSql/Interface/Curd/ISelect/ISelect4.cs
@@ -40,6 +40,7 @@ namespace FreeSql
string ToSql(Expression> select, FieldAliasOptions fieldAlias = FieldAliasOptions.AsIndex);
TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select);
+ ISelect Aggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select, out TReturn result);
decimal Sum(Expression> column);
TMember Min(Expression> column);
TMember Max(Expression> column);
diff --git a/FreeSql/Interface/Curd/ISelect/ISelect5.cs b/FreeSql/Interface/Curd/ISelect/ISelect5.cs
index d1947791..12f4714b 100644
--- a/FreeSql/Interface/Curd/ISelect/ISelect5.cs
+++ b/FreeSql/Interface/Curd/ISelect/ISelect5.cs
@@ -40,6 +40,7 @@ namespace FreeSql
string ToSql(Expression> select, FieldAliasOptions fieldAlias = FieldAliasOptions.AsIndex);
TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select);
+ ISelect Aggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select, out TReturn result);
decimal Sum(Expression> column);
TMember Min(Expression> column);
TMember Max(Expression> column);
diff --git a/FreeSql/Interface/Curd/ISelect/ISelect6.cs b/FreeSql/Interface/Curd/ISelect/ISelect6.cs
index 700cdf03..a6f6dffb 100644
--- a/FreeSql/Interface/Curd/ISelect/ISelect6.cs
+++ b/FreeSql/Interface/Curd/ISelect/ISelect6.cs
@@ -40,6 +40,7 @@ namespace FreeSql
string ToSql(Expression> select, FieldAliasOptions fieldAlias = FieldAliasOptions.AsIndex);
TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select);
+ ISelect Aggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select, out TReturn result);
decimal Sum(Expression> column);
TMember Min(Expression> column);
TMember Max(Expression> column);
diff --git a/FreeSql/Interface/Curd/ISelect/ISelect7.cs b/FreeSql/Interface/Curd/ISelect/ISelect7.cs
index d7117d0c..50c4f0a6 100644
--- a/FreeSql/Interface/Curd/ISelect/ISelect7.cs
+++ b/FreeSql/Interface/Curd/ISelect/ISelect7.cs
@@ -40,6 +40,7 @@ namespace FreeSql
string ToSql(Expression> select, FieldAliasOptions fieldAlias = FieldAliasOptions.AsIndex);
TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select);
+ ISelect Aggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select, out TReturn result);
decimal Sum(Expression> column);
TMember Min(Expression> column);
TMember Max(Expression> column);
diff --git a/FreeSql/Interface/Curd/ISelect/ISelect8.cs b/FreeSql/Interface/Curd/ISelect/ISelect8.cs
index 8ed0514a..f03b7904 100644
--- a/FreeSql/Interface/Curd/ISelect/ISelect8.cs
+++ b/FreeSql/Interface/Curd/ISelect/ISelect8.cs
@@ -40,6 +40,7 @@ namespace FreeSql
string ToSql(Expression> select, FieldAliasOptions fieldAlias = FieldAliasOptions.AsIndex);
TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select);
+ ISelect Aggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select, out TReturn result);
decimal Sum(Expression> column);
TMember Min(Expression> column);
TMember Max(Expression> column);
diff --git a/FreeSql/Interface/Curd/ISelect/ISelect9.cs b/FreeSql/Interface/Curd/ISelect/ISelect9.cs
index 96da6b7a..99218e60 100644
--- a/FreeSql/Interface/Curd/ISelect/ISelect9.cs
+++ b/FreeSql/Interface/Curd/ISelect/ISelect9.cs
@@ -40,6 +40,7 @@ namespace FreeSql
string ToSql(Expression> select, FieldAliasOptions fieldAlias = FieldAliasOptions.AsIndex);
TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select);
+ ISelect Aggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select, out TReturn result);
decimal Sum(Expression> column);
TMember Min(Expression> column);
TMember Max(Expression> column);
diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs
index 3a074d5b..1e9a712a 100644
--- a/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs
+++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs
@@ -118,6 +118,11 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
return this.InternalToAggregate(select?.Body);
}
+ ISelect ISelect.Aggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select, out TReturn result)
+ {
+ result = (this as ISelect).ToAggregate(select);
+ return this;
+ }
List ISelect.ToList(Expression> select)
{
diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs
index 41afd44a..76fbf170 100644
--- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs
+++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs
@@ -210,6 +210,11 @@ namespace FreeSql.Internal.CommonProvider
_tables[0].Parameter = select.Parameters[0];
return this.InternalToAggregate(select?.Body);
}
+ public ISelect Aggregate(Expression, TReturn>> select, out TReturn result)
+ {
+ result = ToAggregate(select);
+ return this;
+ }
public ISelect Where(Expression> exp) => WhereIf(true, exp);
public ISelect WhereIf(bool condition, Expression> exp)
diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs
index 25a71766..005e485b 100644
--- a/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs
+++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs
@@ -94,6 +94,11 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
return this.InternalToAggregate(select?.Body);
}
+ ISelect ISelect.Aggregate(Expression, ISelectGroupingAggregate, TReturn>> select, out TReturn result)
+ {
+ result = (this as ISelect).ToAggregate(select);
+ return this;
+ }
List ISelect.ToList(Expression> select)
{
diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs
index e8bac16d..707eccf8 100644
--- a/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs
+++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs
@@ -97,6 +97,11 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
return this.InternalToAggregate(select?.Body);
}
+ ISelect