diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest5.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest5.cs index 917dc93f..a8c3b9df 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest5.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest5.cs @@ -24,6 +24,12 @@ namespace FreeSql.Tests Assert.Equal(@"SELECT count(distinct a.""status"") as1 FROM ""ts_up_dywhere01"" a", sql); + + sql = fsql.Select().Select(a => new { a.status }).Distinct().ToSql(); + fsql.Select().Select(a => new { a.status }).Distinct().Count(out count); + + Assert.Equal(@"SELECT DISTINCT a.""status"" as1 +FROM ""ts_up_dywhere01"" a", sql); } [Fact] diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 38f19ac3..75a75ceb 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -698,18 +698,23 @@ namespace FreeSql.Internal.CommonProvider var tmpOrderBy = _orderby; var tmpSkip = _skip; var tmpLimit = _limit; + var tmpDistinct = _distinct; _orderby = null; //解决 select count(1) from t order by id 这样的 SQL 错误 _skip = 0; _limit = 0; + _distinct = false; try { - return this.ToList($"count(1){_commonUtils.FieldAsAlias("as1")}").Sum(); //这里的 Sum 为了分表查询 + var countField = "1"; + if (tmpDistinct && _selectExpression != null) countField = $"distinct {this.GetExpressionField(_selectExpression, FieldAliasOptions.AsProperty).field}"; + return this.ToList($"count({countField}){_commonUtils.FieldAsAlias("as1")}").Sum(); //这里的 Sum 为了分表查询 } finally { _orderby = tmpOrderBy; _skip = tmpSkip; _limit = tmpLimit; + _distinct = tmpDistinct; } } public TSelect Count(out long count) @@ -741,18 +746,23 @@ namespace FreeSql.Internal.CommonProvider var tmpOrderBy = _orderby; var tmpSkip = _skip; var tmpLimit = _limit; + var tmpDistinct = _distinct; _orderby = null; _skip = 0; _limit = 0; + _distinct = false; try { - return (await this.ToListAsync($"count(1){_commonUtils.FieldAsAlias("as1")}", cancellationToken)).Sum(); //这里的 Sum 为了分表查询 + var countField = "1"; + if (tmpDistinct && _selectExpression != null) countField = $"distinct {this.GetExpressionField(_selectExpression, FieldAliasOptions.AsProperty).field}"; + return (await this.ToListAsync($"count({countField}){_commonUtils.FieldAsAlias("as1")}", cancellationToken)).Sum(); //这里的 Sum 为了分表查询 } finally { _orderby = tmpOrderBy; _skip = tmpSkip; _limit = tmpLimit; + _distinct = tmpDistinct; } } public virtual Task> ToListAsync(bool includeNestedMembers = false, CancellationToken cancellationToken = default) diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs index 2ff30188..e0a432a4 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs @@ -516,6 +516,15 @@ namespace FreeSql.Internal.CommonProvider static EventHandler _OldAuditDataReaderHandler; public GetAllFieldExpressionTreeInfo GetAllFieldExpressionTreeLevel2() { + if (_selectExpression != null) //ToSql + { + var af = this.GetExpressionField(_selectExpression); + return new GetAllFieldExpressionTreeInfo + { + Field = af.field, + Read = (dr, idx) => throw new Exception("GetAllFieldExpressionTreeInfo.Read Is Null") + }; + } if (_OldAuditDataReaderHandler != _orm.Aop.AuditDataReaderHandler) { _OldAuditDataReaderHandler = _orm.Aop.AuditDataReaderHandler; //清除单表 ExppressionTree