From 56d2128726fbc33b806edd719973e526f5c0f620 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 2 Feb 2021 13:07:01 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20FreeSql.Extensions.Lin?= =?UTF-8?q?q=20Select=20=E9=80=89=E5=AE=9A=E5=AD=97=E6=AE=B5=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=96=B9=E6=B3=95=EF=BC=9B#674=20#533?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/FreeSql.Tests/UnitTest5.cs | 6 ++++++ .../SelectProvider/Select0Provider.cs | 14 ++++++++++++-- .../SelectProvider/Select0ProviderReader.cs | 9 +++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) 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