diff --git a/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/UnitTest1.cs index f17b9ca5..8447389e 100644 --- a/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/UnitTest1.cs @@ -8,6 +8,11 @@ using System.Linq; namespace FreeSql.Tests { public class UnitTest1 { + class NullAggreTestTable { + [Column(IsIdentity = true)] + public int Id { get; set; } + } + ISelect select => g.mysql.Select(); [Fact] public void Test1() { @@ -26,6 +31,9 @@ namespace FreeSql.Tests { var sss = new[] { 1, 2, 3 }; sss.Count(); + var arrg = g.mysql.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) }); + + var arrg222 = g.mysql.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) }); var t1 = g.mysql.Select().Where("").Where(a => a.Id > 0).Skip(100).Limit(200).ToSql(); var t2 = g.mysql.Select().As("b").Where("").Where(a => a.Id > 0).Skip(100).Limit(200).ToSql(); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect1.cs b/FreeSql/Interface/Curd/ISelect/ISelect1.cs index fb169eae..2506a7bd 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect1.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect1.cs @@ -20,6 +20,14 @@ namespace FreeSql { /// string ToSql(Expression> select); + /// + /// 执行SQL查询,返回指定字段的聚合结果 + /// + /// + /// + /// + TReturn ToAggregate(Expression, TReturn>> select); + /// /// 求和 /// diff --git a/FreeSql/Interface/Curd/ISelect/ISelect10.cs b/FreeSql/Interface/Curd/ISelect/ISelect10.cs index c3e6c2db..d534fc53 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect10.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect10.cs @@ -6,6 +6,9 @@ namespace FreeSql { public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class { List ToList(Expression> select); + string ToSql(Expression> select); + + TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); TMember Sum(Expression> column); TMember Min(Expression> column); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect3.cs b/FreeSql/Interface/Curd/ISelect/ISelect3.cs index d5b0b723..2a7afd80 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect3.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect3.cs @@ -6,6 +6,9 @@ namespace FreeSql { public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class { List ToList(Expression> select); + string ToSql(Expression> select); + + TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); TMember Sum(Expression> column); TMember Min(Expression> column); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect4.cs b/FreeSql/Interface/Curd/ISelect/ISelect4.cs index e4d7ad7f..ccf1501d 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect4.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect4.cs @@ -6,6 +6,9 @@ namespace FreeSql { public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class where T4 : class { List ToList(Expression> select); + string ToSql(Expression> select); + + TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); TMember Sum(Expression> column); TMember Min(Expression> column); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect5.cs b/FreeSql/Interface/Curd/ISelect/ISelect5.cs index 186a1aee..82ccd3af 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect5.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect5.cs @@ -6,6 +6,9 @@ namespace FreeSql { public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class { List ToList(Expression> select); + string ToSql(Expression> select); + + TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); TMember Sum(Expression> column); TMember Min(Expression> column); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect6.cs b/FreeSql/Interface/Curd/ISelect/ISelect6.cs index a1767ff7..95709f3c 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect6.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect6.cs @@ -6,6 +6,9 @@ namespace FreeSql { public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class { List ToList(Expression> select); + string ToSql(Expression> select); + + TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); TMember Sum(Expression> column); TMember Min(Expression> column); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect7.cs b/FreeSql/Interface/Curd/ISelect/ISelect7.cs index acd67af9..7064d061 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect7.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect7.cs @@ -6,6 +6,9 @@ namespace FreeSql { public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class { List ToList(Expression> select); + string ToSql(Expression> select); + + TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); TMember Sum(Expression> column); TMember Min(Expression> column); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect8.cs b/FreeSql/Interface/Curd/ISelect/ISelect8.cs index 4ef41d90..730c657f 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect8.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect8.cs @@ -6,6 +6,9 @@ namespace FreeSql { public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class { List ToList(Expression> select); + string ToSql(Expression> select); + + TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); TMember Sum(Expression> column); TMember Min(Expression> column); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect9.cs b/FreeSql/Interface/Curd/ISelect/ISelect9.cs index 3bd25b51..d6554f38 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect9.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect9.cs @@ -6,6 +6,9 @@ namespace FreeSql { public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class { List ToList(Expression> select); + string ToSql(Expression> select); + + TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); TMember Sum(Expression> column); TMember Min(Expression> column); diff --git a/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs b/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs index 7659a084..b4a1e98b 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs @@ -44,11 +44,41 @@ namespace FreeSql { } public interface ISelectGroupingAggregate { + /// + /// 分组的数据 + /// T1 Key { get; set; } + /// + /// 记录总数 + /// + /// int Count(); + /// + /// 求和 + /// + /// + /// + /// T3 Sum(T3 column); + /// + /// 平均值 + /// + /// + /// + /// T3 Avg(T3 column); + /// + /// 最大值 + /// + /// + /// + /// T3 Max(T3 column); + /// + /// 最小值 + /// + /// + /// T3 Min(T3 column); } } diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index e6a65446..e946e48d 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -249,15 +249,11 @@ namespace FreeSql.Internal { if (expStack.First().NodeType != ExpressionType.Parameter) return _common.FormatSql("{0}", Expression.Lambda(exp).Compile().DynamicInvoke()); if (callExp != null) return ExpressionLambdaToSql(callExp, _tables, _selectColumnMap, getSelectGroupingMapString, tbtype, isQuoteName); if (getSelectGroupingMapString != null && expStack.First().Type.FullName.StartsWith("FreeSql.ISelectGroupingAggregate`")) { - var expText = getSelectGroupingMapString(expStack.Where((a, b) => b >= 2).ToArray()); - if (string.IsNullOrEmpty(expText) == false) return expText; + if (getSelectGroupingMapString != null) { + var expText = getSelectGroupingMapString(expStack.Where((a, b) => b >= 2).ToArray()); + if (string.IsNullOrEmpty(expText) == false) return expText; + } } - //if (exp4.Expression != null && exp4.Expression.NodeType == ExpressionType.MemberAccess) { - // var keyExp = exp4.Expression as MemberExpression; - // if (keyExp.Member.Name == "Key" && keyExp.Expression.Type.FullName.StartsWith("FreeSql.ISelectGroupingAggregate`")) { - // var expText = getSelectGroupingMapString(exp4) - // } - //} if (_tables == null) { var pp = expStack.Pop() as ParameterExpression; @@ -282,8 +278,11 @@ namespace FreeSql.Internal { throw new NotImplementedException("未现实 MemberAccess 下的 Constant"); case ExpressionType.Parameter: case ExpressionType.MemberAccess: - var tb2tmp = _common.GetTableByEntity(exp2.Type); + var exp2Type = exp2.Type; + if (exp2Type.FullName.StartsWith("FreeSql.ISelectGroupingAggregate`")) exp2Type = exp2Type.GenericTypeArguments.FirstOrDefault() ?? exp2.Type; + var tb2tmp = _common.GetTableByEntity(exp2Type); var mp2 = exp2 as MemberExpression; + if (mp2?.Member.Name == "Key" && mp2.Expression.Type.FullName.StartsWith("FreeSql.ISelectGroupingAggregate`")) continue; if (tb2tmp != null) { if (exp2.NodeType == ExpressionType.Parameter) alias2 = (exp2 as ParameterExpression).Name; else alias2 = $"{alias2}__{mp2.Member.Name}"; diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 71ee06bf..71e6e5e7 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -254,6 +254,15 @@ namespace FreeSql.Internal.CommonProvider { protected List InternalToList(Expression select) => this.ToListMapReader(this.GetNewExpressionField(select as NewExpression)); protected string InternalToSql(Expression select) => this.ToSql(this.GetNewExpressionField(select as NewExpression).field); + protected TReturn InternalToAggregate(Expression select) { + var map = new ReadAnonymousTypeInfo(); + var field = new StringBuilder(); + var index = 0; + + _commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null); + return this.ToListMapReader((map, map.Childs.Count > 0 ? field.Remove(0, 2).ToString() : null)).FirstOrDefault(); + } + protected TSelect InternalWhere(Expression exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp, null)); protected TSelect InternalJoin(Expression exp) { diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs index fd2ed9a3..53e6a57c 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs @@ -34,8 +34,12 @@ namespace FreeSql.Internal.CommonProvider { TMember ISelect.Sum(Expression> column) => this.InternalSum(column?.Body); + TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregate(select?.Body); + List ISelect.ToList(Expression> select) => this.InternalToList(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); + ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); ISelect ISelect.WhereIf(bool condition, Expression> exp) => condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)) : this; diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs index d76875e2..d29d1fb4 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs @@ -87,8 +87,11 @@ namespace FreeSql.Internal.CommonProvider { public TMember Sum(Expression> column) => this.InternalSum(column?.Body); public List ToList(Expression> select) => this.InternalToList(select?.Body); + public string ToSql(Expression> select) => this.InternalToSql(select?.Body); + public TReturn ToAggregate(Expression, TReturn>> select) => this.InternalToAggregate(select?.Body); + public ISelect Where(Expression> exp) => this.InternalWhere(exp?.Body); public ISelect Where(Expression> exp) where T2 : class => this.InternalWhere(exp?.Body); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs index fecab1d0..e5eeb366 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs @@ -29,6 +29,10 @@ namespace FreeSql.Internal.CommonProvider { List ISelect.ToList(Expression> select) => this.InternalToList(select?.Body); + TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregate(select?.Body); + + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); + ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); ISelect ISelect.WhereIf(bool condition, Expression> exp) => condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)) : this; diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs index 4c8f4302..be518a2a 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs @@ -28,8 +28,12 @@ namespace FreeSql.Internal.CommonProvider { TMember ISelect.Sum(Expression> column) => this.InternalSum(column?.Body); + TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregate(select?.Body); + List ISelect.ToList(Expression> select) => this.InternalToList(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); + ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); ISelect ISelect.WhereIf(bool condition, Expression> exp) => condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)) : this; diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs index 65428796..7ded46be 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs @@ -29,8 +29,12 @@ namespace FreeSql.Internal.CommonProvider { TMember ISelect.Sum(Expression> column) => this.InternalSum(column?.Body); + TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregate(select?.Body); + List ISelect.ToList(Expression> select) => this.InternalToList(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); + ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); ISelect ISelect.WhereIf(bool condition, Expression> exp) => condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)) : this; diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs index fc7342cf..9a11b8f4 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs @@ -30,8 +30,12 @@ namespace FreeSql.Internal.CommonProvider { TMember ISelect.Sum(Expression> column) => this.InternalSum(column?.Body); + TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregate(select?.Body); + List ISelect.ToList(Expression> select) => this.InternalToList(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); + ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); ISelect ISelect.WhereIf(bool condition, Expression> exp) => condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)) : this; diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs index 8014c0c0..4133cfee 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs @@ -31,8 +31,12 @@ namespace FreeSql.Internal.CommonProvider { TMember ISelect.Sum(Expression> column) => this.InternalSum(column?.Body); + TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregate(select?.Body); + List ISelect.ToList(Expression> select) => this.InternalToList(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); + ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); ISelect ISelect.WhereIf(bool condition, Expression> exp) => condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)) : this; diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs index 6b9ff4c7..4211d5c5 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs @@ -32,8 +32,12 @@ namespace FreeSql.Internal.CommonProvider { TMember ISelect.Sum(Expression> column) => this.InternalSum(column?.Body); + TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregate(select?.Body); + List ISelect.ToList(Expression> select) => this.InternalToList(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); + ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); ISelect ISelect.WhereIf(bool condition, Expression> exp) => condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)) : this; diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs index e96a0f97..2e69af45 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs @@ -33,8 +33,12 @@ namespace FreeSql.Internal.CommonProvider { TMember ISelect.Sum(Expression> column) => this.InternalSum(column?.Body); + TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregate(select?.Body); + List ISelect.ToList(Expression> select) => this.InternalToList(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); + ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); ISelect ISelect.WhereIf(bool condition, Expression> exp) => condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)) : this;