diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index bcb43906..3dad8a00 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -487,6 +487,22 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + var groupsql01 = fsql.Select() + .GroupBy(a => new + { + djjg = a.Id, + qllx = a.Nickname, + hjhs = a.GroupId + }) + .ToSql(g => new + { + g.Key.djjg, + g.Key.qllx, + xhjsl = g.Count(g.Key.djjg), + hjzhs = g.Sum(g.Key.hjhs), + blywsl = g.Count() + }, FieldAliasOptions.AsProperty); + using (var uow = fsql.CreateUnitOfWork()) { uow.Orm.Select().ForUpdate().ToList(); diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 671a7e7c..656de788 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -277,15 +277,23 @@ namespace FreeSql.Internal return false; } if (parent.CsType == null) parent.CsType = exp.Type; - var pdbfield = parent.DbField = ExpressionLambdaToSql(exp, getTSC()); - if (parent.MapType == null || _tables?.Any(a => a.Table?.IsRereadSql == true) == true) + try { - var findcol = SearchColumnByField(_tables, null, parent.DbField); - if (parent.MapType == null) parent.MapType = findcol?.Attribute.MapType ?? exp.Type; - if (findcol != null) pdbfield = _common.RereadColumn(findcol, pdbfield); + var pdbfield = parent.DbField = ExpressionLambdaToSql(exp, getTSC()); + if (parent.MapType == null || _tables?.Any(a => a.Table?.IsRereadSql == true) == true) + { + var findcol = SearchColumnByField(_tables, null, parent.DbField); + if (parent.MapType == null) parent.MapType = findcol?.Attribute.MapType ?? exp.Type; + if (findcol != null) pdbfield = _common.RereadColumn(findcol, pdbfield); + } + field.Append(", ").Append(pdbfield); + LocalSetFieldAlias(ref index, _tables != null || + SelectGroupingProvider._ParseExpOnlyDbField.Value != pdbfield); + } + finally + { + SelectGroupingProvider._ParseExpOnlyDbField.Value = null; } - field.Append(", ").Append(pdbfield); - LocalSetFieldAlias(ref index, true); return false; } return false; diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs index 7d26c47e..c719221f 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs @@ -31,6 +31,7 @@ namespace FreeSql.Internal.CommonProvider _tables = tables; } + public static ThreadLocal _ParseExpOnlyDbField = new ThreadLocal(); public override string ParseExp(Expression[] members) { ParseExpMapResult = null; @@ -52,7 +53,11 @@ namespace FreeSql.Internal.CommonProvider } ParseExpMapResult = read; if (!_addFieldAlias) return read.DbField; - if (_comonExp.EndsWithDbNestedField(read.DbField, read.DbNestedField) == false) return $"{read.DbField}{_comonExp._common.FieldAsAlias(read.DbNestedField)}"; + if (_comonExp.EndsWithDbNestedField(read.DbField, read.DbNestedField) == false) + { + _ParseExpOnlyDbField.Value = read.DbField; + return $"{read.DbField}{_comonExp._common.FieldAsAlias(read.DbNestedField)}"; + } return read.DbField; case "Value": var curtables = _tables;