From b9a0251ef1fafacd437993a45fbf6a262429a629 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Mon, 27 Jul 2020 19:57:53 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20GroupBy(..).Count()=20?= =?UTF-8?q?=E5=BC=80=E5=90=AF=E5=8F=82=E6=95=B0=E5=8C=96=E6=97=A0=E6=95=88?= =?UTF-8?q?=E7=9A=84=20bug=20#390=EF=BC=9B=20UseGenerateCommandParameterWi?= =?UTF-8?q?thLambda?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/FreeSql.Tests/Issues/390.cs | 60 +++++++++++++++++++ .../SelectProvider/SelectGroupingProvider.cs | 21 ++++--- 2 files changed, 70 insertions(+), 11 deletions(-) create mode 100644 FreeSql.Tests/FreeSql.Tests/Issues/390.cs diff --git a/FreeSql.Tests/FreeSql.Tests/Issues/390.cs b/FreeSql.Tests/FreeSql.Tests/Issues/390.cs new file mode 100644 index 00000000..bac347c8 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/Issues/390.cs @@ -0,0 +1,60 @@ +using FreeSql.DataAnnotations; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; +using System.Threading; +using Xunit; + +namespace FreeSql.Tests.Issues +{ + public class _390 + { + [Fact] + public void SelectTest() + { + IFreeSql db = new FreeSql.FreeSqlBuilder() + .UseConnectionString(FreeSql.DataType.Oracle, "user id=1user;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=1") + .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) + .UseGenerateCommandParameterWithLambda(true) + .UseAutoSyncStructure(true) + .UseMonitorCommand(cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText)) + .Build(); + + var startTime = DateTime.Now; + var endTime = DateTime.Now; + + var cou = db.Select() + .Where(a => a.ScheduledDttm.Date >= startTime.Date && a.ScheduledDttm.Date <= (endTime.AddDays(1)).Date) + .GroupBy(a => + new + { + a.HospitalName, + a.Dep, + a.Instrna, + a.ConfirmDoctorName, + a.ScheduledDttm.Date + }) + .Count(); + } + + [Table(Name = "V_HospitalReport")] + public class V_HospitalReport + { + [Column(Name = "hospital_name")] + public string HospitalName { get; set; } + + [Column(Name = "dep")] + public string Dep { get; set; } + + [Column(Name = "instrna")] + public string Instrna { get; set; } + + [Column(Name = "confirm_doctor_name")] + public string ConfirmDoctorName { get; set; } + + [Column(Name = "Scheduled_Dttm")] + public DateTime ScheduledDttm { get; set; } + } + } +} diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs index e353c0f5..85f208d0 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs @@ -2,6 +2,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Linq.Expressions; using System.Reflection; @@ -13,13 +14,13 @@ namespace FreeSql.Internal.CommonProvider public class SelectGroupingProvider { public IFreeSql _orm; - public object _select; + public Select0Provider _select; public ReadAnonymousTypeInfo _map; public string _field; public CommonExpression _comonExp; public List _tables; - public SelectGroupingProvider(IFreeSql orm, object select, ReadAnonymousTypeInfo map, string field, CommonExpression comonExp, List tables) + public SelectGroupingProvider(IFreeSql orm, Select0Provider select, ReadAnonymousTypeInfo map, string field, CommonExpression comonExp, List tables) { _orm = orm; _select = select; @@ -139,7 +140,7 @@ namespace FreeSql.Internal.CommonProvider public class SelectGroupingProvider : SelectGroupingProvider, ISelectGrouping { - public SelectGroupingProvider(IFreeSql orm, object select, ReadAnonymousTypeInfo map, string field, CommonExpression comonExp, List tables) + public SelectGroupingProvider(IFreeSql orm, Select0Provider select, ReadAnonymousTypeInfo map, string field, CommonExpression comonExp, List tables) :base(orm, select, map, field, comonExp, tables) { } public string ToSql(Expression, TReturn>> select, FieldAliasOptions fieldAlias = FieldAliasOptions.AsIndex) => InternalToSql(select, fieldAlias); @@ -154,26 +155,24 @@ namespace FreeSql.Internal.CommonProvider public ISelectGrouping Skip(int offset) { - var method = _select.GetType().GetMethod("Skip", new[] { typeof(int) }); - method.Invoke(_select, new object[] { offset }); + _select._skip = offset; return this; } public ISelectGrouping Offset(int offset) => this.Skip(offset); public ISelectGrouping Limit(int limit) { - var method = _select.GetType().GetMethod("Limit", new[] { typeof(int) }); - method.Invoke(_select, new object[] { limit }); + _select._limit = limit; return this; } public ISelectGrouping Take(int limit) => this.Limit(limit); public ISelectGrouping Page(int pageNumber, int pageSize) { - var method = _select.GetType().GetMethod("Page", new[] { typeof(int), typeof(int) }); - method.Invoke(_select, new object[] { pageNumber, pageSize }); + _select._skip = Math.Max(0, pageNumber - 1) * pageSize; + _select._limit = pageSize; return this; } - public long Count() => long.TryParse(string.Concat(_orm.Ado.ExecuteScalar($"select count(1) from ({this.ToSql($"1{_comonExp._common.FieldAsAlias("as1")}")}) fta")), out var trylng) ? trylng : default(long); + public long Count() => long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, $"select count(1) from ({this.ToSql($"1{_comonExp._common.FieldAsAlias("as1")}")}) fta", _select._params.ToArray())), out var trylng) ? trylng : default(long); public ISelectGrouping Count(out long count) { count = this.Count(); @@ -202,7 +201,7 @@ namespace FreeSql.Internal.CommonProvider #if net40 #else - async public Task CountAsync() => long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync($"select count(1) from ({this.ToSql($"1{_comonExp._common.FieldAsAlias("as1")}")}) fta")), out var trylng) ? trylng : default(long); + async public Task CountAsync() => long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(CommandType.Text, $"select count(1) from ({this.ToSql($"1{_comonExp._common.FieldAsAlias("as1")}")}) fta", _select._params.ToArray())), out var trylng) ? trylng : default(long); public Task> ToListAsync(Expression, TReturn>> select) => InternalToList(select, typeof(TReturn), true) as Task>; async public Task> ToDictionaryAsync(Expression, TElement>> elementSelector)