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 ISelect.Aggregate(Expression, 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/Select4Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs index d4c9f644..c23c314c 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs @@ -100,6 +100,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, 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/Select5Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs index 7a824b06..d85e2577 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs @@ -103,6 +103,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, 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/Select6Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs index 8dcf25e6..71e7edd6 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs @@ -106,6 +106,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, 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/Select7Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs index 703f446b..5b9657c3 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs @@ -109,6 +109,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, 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/Select8Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs index 6ff53f5a..ae1eb8bd 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs @@ -112,6 +112,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, 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/Select9Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs index 63fb5ae0..f14ae04f 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs @@ -115,6 +115,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, TReturn>> select, out TReturn result) + { + result = (this as ISelect).ToAggregate(select); + return this; + } List ISelect.ToList(Expression> select) {