From 79e21295c347178378e08435c7916f2edc15f13d Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Sun, 12 May 2019 20:13:56 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E6=94=B9=20Query/ToList=20?= =?UTF-8?q?=E6=B7=B7=E5=90=88=E4=BD=BF=E7=94=A8=E6=97=B6=EF=BC=8C=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E5=AF=BC=E8=87=B4=E7=9A=84=20ET=20=E7=BC=93=E5=AD=98?= =?UTF-8?q?=20bug=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/FreeSql.csproj | 2 +- .../CommonProvider/AdoProvider/AdoProvider.cs | 180 +++++++++++++----- .../AdoProvider/AdoProviderAsync.cs | 180 +++++++++++++----- .../SelectProvider/Select0Provider.cs | 14 +- FreeSql/Internal/UtilsExpressionTree.cs | 15 +- 5 files changed, 288 insertions(+), 103 deletions(-) diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index f066981b..352b74cf 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 0.5.14 + 0.5.15 true YeXiangQin FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite. diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs index d6ae51a8..45b5c117 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs @@ -85,16 +85,22 @@ namespace FreeSql.Internal.CommonProvider { var ret = new List(); if (string.IsNullOrEmpty(cmdText)) return ret; var type = typeof(T); + string flag = null; int[] indexes = null; var props = dicQueryTypeGetProperties.GetOrAdd(type, k => type.GetProperties()); ExecuteReader(connection, transaction, dr => { if (indexes == null) { + var sbflag = new StringBuilder().Append("query"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes = props.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag = sbflag.ToString(); } - ret.Add((T)Utils.ExecuteArrayRowReadClassOrTuple(type, indexes, dr, 0, _util).Value); + ret.Add((T)Utils.ExecuteArrayRowReadClassOrTuple(flag, type, indexes, dr, 0, _util).Value); }, cmdType, cmdText, cmdParms); return ret; } @@ -108,32 +114,44 @@ namespace FreeSql.Internal.CommonProvider { if (string.IsNullOrEmpty(cmdText)) return (new List(), new List()); var ret1 = new List(); var type1 = typeof(T1); + string flag1 = null; int[] indexes1 = null; var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); var ret2 = new List(); var type2 = typeof(T2); + string flag2 = null; int[] indexes2 = null; var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); ExecuteReaderMultiple(2, connection, transaction, (dr, result) => { switch(result) { case 0: if (indexes1 == null) { + var sbflag = new StringBuilder().Append("query"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag1 = sbflag.ToString(); } - ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value); + ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value); break; case 1: if (indexes2 == null) { + var sbflag = new StringBuilder().Append("query"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag2 = sbflag.ToString(); } - ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value); + ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value); break; } }, cmdType, cmdText, cmdParms); @@ -149,46 +167,64 @@ namespace FreeSql.Internal.CommonProvider { if (string.IsNullOrEmpty(cmdText)) return (new List(), new List(), new List()); var ret1 = new List(); var type1 = typeof(T1); + string flag1 = null; int[] indexes1 = null; var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); var ret2 = new List(); var type2 = typeof(T2); + string flag2 = null; int[] indexes2 = null; var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); var ret3 = new List(); var type3 = typeof(T3); + string flag3 = null; int[] indexes3 = null; var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties()); ExecuteReaderMultiple(3, connection, transaction, (dr, result) => { switch (result) { case 0: if (indexes1 == null) { + var sbflag = new StringBuilder().Append("query"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag1 = sbflag.ToString(); } - ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value); + ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value); break; case 1: if (indexes2 == null) { + var sbflag = new StringBuilder().Append("query"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag2 = sbflag.ToString(); } - ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value); + ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value); break; case 2: if (indexes3 == null) { + var sbflag = new StringBuilder().Append("query"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag3 = sbflag.ToString(); } - ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(type3, indexes3, dr, 0, _util).Value); + ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, dr, 0, _util).Value); break; } }, cmdType, cmdText, cmdParms); @@ -204,60 +240,84 @@ namespace FreeSql.Internal.CommonProvider { if (string.IsNullOrEmpty(cmdText)) return (new List(), new List(), new List(), new List()); var ret1 = new List(); var type1 = typeof(T1); + string flag1 = null; int[] indexes1 = null; var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); var ret2 = new List(); var type2 = typeof(T2); + string flag2 = null; int[] indexes2 = null; var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); var ret3 = new List(); var type3 = typeof(T3); + string flag3 = null; int[] indexes3 = null; var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties()); var ret4 = new List(); var type4 = typeof(T4); + string flag4 = null; int[] indexes4 = null; var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties()); ExecuteReaderMultiple(4, connection, transaction, (dr, result) => { switch (result) { case 0: if (indexes1 == null) { + var sbflag = new StringBuilder().Append("query"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag1 = sbflag.ToString(); } - ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value); + ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value); break; case 1: if (indexes2 == null) { + var sbflag = new StringBuilder().Append("query"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag2 = sbflag.ToString(); } - ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value); + ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value); break; case 2: if (indexes3 == null) { + var sbflag = new StringBuilder().Append("query"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag3 = sbflag.ToString(); } - ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(type3, indexes3, dr, 0, _util).Value); + ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, dr, 0, _util).Value); break; case 3: if (indexes4 == null) { + var sbflag = new StringBuilder().Append("query"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes4 = props4.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag4 = sbflag.ToString(); } - ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(type4, indexes4, dr, 0, _util).Value); + ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(flag4, type4, indexes4, dr, 0, _util).Value); break; } }, cmdType, cmdText, cmdParms); @@ -273,74 +333,104 @@ namespace FreeSql.Internal.CommonProvider { if (string.IsNullOrEmpty(cmdText)) return (new List(), new List(), new List(), new List(), new List()); var ret1 = new List(); var type1 = typeof(T1); + string flag1 = null; int[] indexes1 = null; var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); var ret2 = new List(); var type2 = typeof(T2); + string flag2 = null; int[] indexes2 = null; var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); var ret3 = new List(); var type3 = typeof(T3); + string flag3 = null; int[] indexes3 = null; var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties()); var ret4 = new List(); var type4 = typeof(T4); + string flag4 = null; int[] indexes4 = null; var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties()); var ret5 = new List(); var type5 = typeof(T5); + string flag5 = null; int[] indexes5 = null; var props5 = dicQueryTypeGetProperties.GetOrAdd(type5, k => type1.GetProperties()); ExecuteReaderMultiple(5, connection, transaction, (dr, result) => { switch (result) { case 0: if (indexes1 == null) { + var sbflag = new StringBuilder().Append("query"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag1 = sbflag.ToString(); } - ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value); + ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value); break; case 1: if (indexes2 == null) { + var sbflag = new StringBuilder().Append("query"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag2 = sbflag.ToString(); } - ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value); + ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value); break; case 2: if (indexes3 == null) { + var sbflag = new StringBuilder().Append("query"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag3 = sbflag.ToString(); } - ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(type3, indexes3, dr, 0, _util).Value); + ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, dr, 0, _util).Value); break; case 3: if (indexes4 == null) { + var sbflag = new StringBuilder().Append("query"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes4 = props4.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag4 = sbflag.ToString(); } - ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(type4, indexes4, dr, 0, _util).Value); + ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(flag4, type4, indexes4, dr, 0, _util).Value); break; case 4: if (indexes5 == null) { + var sbflag = new StringBuilder().Append("query"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes5 = props5.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag5 = sbflag.ToString(); } - ret5.Add((T5)Utils.ExecuteArrayRowReadClassOrTuple(type5, indexes5, dr, 0, _util).Value); + ret5.Add((T5)Utils.ExecuteArrayRowReadClassOrTuple(flag5, type5, indexes5, dr, 0, _util).Value); break; } }, cmdType, cmdText, cmdParms); diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs index fccbb1df..4311012b 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs @@ -18,16 +18,22 @@ namespace FreeSql.Internal.CommonProvider { var ret = new List(); if (string.IsNullOrEmpty(cmdText)) return ret; var type = typeof(T); + string flag = null; int[] indexes = null; var props = dicQueryTypeGetProperties.GetOrAdd(type, k => type.GetProperties()); await ExecuteReaderAsync(connection, transaction, dr => { if (indexes == null) { + var sbflag = new StringBuilder().Append("query"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes = props.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag = sbflag.ToString(); } - ret.Add((T)Utils.ExecuteArrayRowReadClassOrTuple(type, indexes, dr, 0, _util).Value); + ret.Add((T)Utils.ExecuteArrayRowReadClassOrTuple(flag, type, indexes, dr, 0, _util).Value); return Task.CompletedTask; }, cmdType, cmdText, cmdParms); return ret; @@ -42,32 +48,44 @@ namespace FreeSql.Internal.CommonProvider { if (string.IsNullOrEmpty(cmdText)) return (new List(), new List()); var ret1 = new List(); var type1 = typeof(T1); + string flag1 = null; int[] indexes1 = null; var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); var ret2 = new List(); var type2 = typeof(T2); + string flag2 = null; int[] indexes2 = null; var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); await ExecuteReaderMultipleAsync(2, connection, transaction, (dr, result) => { switch (result) { case 0: if (indexes1 == null) { + var sbflag = new StringBuilder().Append("QueryAsync"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag1 = sbflag.ToString(); } - ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value); + ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value); break; case 1: if (indexes2 == null) { + var sbflag = new StringBuilder().Append("QueryAsync"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag2 = sbflag.ToString(); } - ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value); + ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value); break; } return Task.CompletedTask; @@ -84,46 +102,64 @@ namespace FreeSql.Internal.CommonProvider { if (string.IsNullOrEmpty(cmdText)) return (new List(), new List(), new List()); var ret1 = new List(); var type1 = typeof(T1); + string flag1 = null; int[] indexes1 = null; var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); var ret2 = new List(); var type2 = typeof(T2); + string flag2 = null; int[] indexes2 = null; var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); var ret3 = new List(); var type3 = typeof(T3); + string flag3 = null; int[] indexes3 = null; var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties()); await ExecuteReaderMultipleAsync(3, connection, transaction, (dr, result) => { switch (result) { case 0: if (indexes1 == null) { + var sbflag = new StringBuilder().Append("QueryAsync"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag1 = sbflag.ToString(); } - ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value); + ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value); break; case 1: if (indexes2 == null) { + var sbflag = new StringBuilder().Append("QueryAsync"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag2 = sbflag.ToString(); } - ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value); + ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value); break; case 2: if (indexes3 == null) { + var sbflag = new StringBuilder().Append("QueryAsync"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag3 = sbflag.ToString(); } - ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(type3, indexes3, dr, 0, _util).Value); + ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, dr, 0, _util).Value); break; } return Task.CompletedTask; @@ -140,60 +176,84 @@ namespace FreeSql.Internal.CommonProvider { if (string.IsNullOrEmpty(cmdText)) return (new List(), new List(), new List(), new List()); var ret1 = new List(); var type1 = typeof(T1); + string flag1 = null; int[] indexes1 = null; var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); var ret2 = new List(); var type2 = typeof(T2); + string flag2 = null; int[] indexes2 = null; var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); var ret3 = new List(); var type3 = typeof(T3); + string flag3 = null; int[] indexes3 = null; var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties()); var ret4 = new List(); var type4 = typeof(T4); + string flag4 = null; int[] indexes4 = null; var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties()); await ExecuteReaderMultipleAsync(4, connection, transaction, (dr, result) => { switch (result) { case 0: if (indexes1 == null) { + var sbflag = new StringBuilder().Append("QueryAsync"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag1 = sbflag.ToString(); } - ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value); + ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value); break; case 1: if (indexes2 == null) { + var sbflag = new StringBuilder().Append("QueryAsync"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag2 = sbflag.ToString(); } - ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value); + ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value); break; case 2: if (indexes3 == null) { + var sbflag = new StringBuilder().Append("QueryAsync"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag3 = sbflag.ToString(); } - ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(type3, indexes3, dr, 0, _util).Value); + ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, dr, 0, _util).Value); break; case 3: if (indexes4 == null) { + var sbflag = new StringBuilder().Append("QueryAsync"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes4 = props4.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag4 = sbflag.ToString(); } - ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(type4, indexes4, dr, 0, _util).Value); + ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(flag4, type4, indexes4, dr, 0, _util).Value); break; } return Task.CompletedTask; @@ -210,74 +270,104 @@ namespace FreeSql.Internal.CommonProvider { if (string.IsNullOrEmpty(cmdText)) return (new List(), new List(), new List(), new List(), new List()); var ret1 = new List(); var type1 = typeof(T1); + string flag1 = null; int[] indexes1 = null; var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); var ret2 = new List(); var type2 = typeof(T2); + string flag2 = null; int[] indexes2 = null; var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); var ret3 = new List(); var type3 = typeof(T3); + string flag3 = null; int[] indexes3 = null; var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties()); var ret4 = new List(); var type4 = typeof(T4); + string flag4 = null; int[] indexes4 = null; var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties()); var ret5 = new List(); var type5 = typeof(T5); + string flag5 = null; int[] indexes5 = null; var props5 = dicQueryTypeGetProperties.GetOrAdd(type5, k => type1.GetProperties()); await ExecuteReaderMultipleAsync(5, connection, transaction, (dr, result) => { switch (result) { case 0: if (indexes1 == null) { + var sbflag = new StringBuilder().Append("QueryAsync"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag1 = sbflag.ToString(); } - ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value); + ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value); break; case 1: if (indexes2 == null) { + var sbflag = new StringBuilder().Append("QueryAsync"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag2 = sbflag.ToString(); } - ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value); + ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value); break; case 2: if (indexes3 == null) { + var sbflag = new StringBuilder().Append("QueryAsync"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag3 = sbflag.ToString(); } - ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(type3, indexes3, dr, 0, _util).Value); + ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, dr, 0, _util).Value); break; case 3: if (indexes4 == null) { + var sbflag = new StringBuilder().Append("QueryAsync"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes4 = props4.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag4 = sbflag.ToString(); } - ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(type4, indexes4, dr, 0, _util).Value); + ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(flag4, type4, indexes4, dr, 0, _util).Value); break; case 4: if (indexes5 == null) { + var sbflag = new StringBuilder().Append("QueryAsync"); var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - for (var a = 0; a < dr.FieldCount; a++) - dic.Add(dr.GetName(a), a); + for (var a = 0; a < dr.FieldCount; a++) { + var name = dr.GetName(a); + sbflag.Append(name).Append(":").Append(a).Append(","); + dic.Add(name, a); + } indexes5 = props5.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray(); + flag5 = sbflag.ToString(); } - ret5.Add((T5)Utils.ExecuteArrayRowReadClassOrTuple(type5, indexes5, dr, 0, _util).Value); + ret5.Add((T5)Utils.ExecuteArrayRowReadClassOrTuple(flag5, type5, indexes5, dr, 0, _util).Value); break; } return Task.CompletedTask; diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index b8445add..d5e6cd7d 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -273,10 +273,11 @@ namespace FreeSql.Internal.CommonProvider { var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms); _orm.Aop.CurdBefore?.Invoke(this, before); var ret = new List(); + var flagStr = $"ToListField:{field}"; Exception exception = null; try { _orm.Ado.ExecuteReader(_connection, _transaction, dr => { - var read = Utils.ExecuteArrayRowReadClassOrTuple(type, null, dr, 0, _commonUtils); + var read = Utils.ExecuteArrayRowReadClassOrTuple(flagStr, type, null, dr, 0, _commonUtils); ret.Add((TTuple)read.Value); }, CommandType.Text, sql, dbParms); } catch (Exception ex) { @@ -299,10 +300,11 @@ namespace FreeSql.Internal.CommonProvider { var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms); _orm.Aop.CurdBefore?.Invoke(this, before); var ret = new List(); + var flagStr = $"ToListField:{field}"; Exception exception = null; try { await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => { - var read = Utils.ExecuteArrayRowReadClassOrTuple(type, null, dr, 0, _commonUtils); + var read = Utils.ExecuteArrayRowReadClassOrTuple(flagStr, type, null, dr, 0, _commonUtils); ret.Add((TTuple)read.Value); return Task.CompletedTask; }, CommandType.Text, sql, dbParms); @@ -537,7 +539,7 @@ namespace FreeSql.Internal.CommonProvider { if (tbiindex == 0) blockExp.AddRange(new Expression[] { - Expression.Assign(readExp, Expression.Call(Utils.MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(typei), Expression.Constant(null, typeof(int[])), rowExp, dataIndexExp, Expression.Constant(_commonUtils) })), + Expression.Assign(readExp, Expression.Call(Utils.MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(null, typeof(string)), Expression.Constant(typei), Expression.Constant(null, typeof(int[])), rowExp, dataIndexExp, Expression.Constant(_commonUtils) })), Expression.IfThen( Expression.GreaterThan(readExpDataIndex, dataIndexExp), Expression.Assign(dataIndexExp, readExpDataIndex) @@ -577,7 +579,7 @@ namespace FreeSql.Internal.CommonProvider { Expression.IfThenElse( curExpIfNotNull, Expression.Block(new Expression[] { - Expression.Assign(readExp, Expression.Call(Utils.MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(typei), Expression.Constant(null, typeof(int[])), rowExp, dataIndexExp, Expression.Constant(_commonUtils) })), + Expression.Assign(readExp, Expression.Call(Utils.MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(null, typeof(string)), Expression.Constant(typei), Expression.Constant(null, typeof(int[])), rowExp, dataIndexExp, Expression.Constant(_commonUtils) })), Expression.IfThen( Expression.GreaterThan(readExpDataIndex, dataIndexExp), Expression.Assign(dataIndexExp, readExpDataIndex) @@ -694,7 +696,7 @@ namespace FreeSql.Internal.CommonProvider { Expression.Add(dataIndexExp, Expression.Constant(1)) ); else { - readExpAssign = Expression.Call(Utils.MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(prop.PropertyType), Expression.Constant(null, typeof(int[])), rowExp, dataIndexExp, Expression.Constant(_commonUtils) }); + readExpAssign = Expression.Call(Utils.MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(null, typeof(string)), Expression.Constant(prop.PropertyType), Expression.Constant(null, typeof(int[])), rowExp, dataIndexExp, Expression.Constant(_commonUtils) }); } } blockExp.AddRange(new Expression[] { @@ -719,7 +721,7 @@ namespace FreeSql.Internal.CommonProvider { blockExp.Clear(); blockExp.AddRange(new Expression[] { Expression.Assign(dataIndexExp, Expression.Constant(0)), - Expression.Assign(readExp, Expression.Call(Utils.MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(type), Expression.Constant(null, typeof(int[])), rowExp, dataIndexExp, Expression.Constant(_commonUtils) })), + Expression.Assign(readExp, Expression.Call(Utils.MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(null, typeof(string)), Expression.Constant(type), Expression.Constant(null, typeof(int[])), rowExp, dataIndexExp, Expression.Constant(_commonUtils) })), Expression.IfThen( Expression.NotEqual(readExpValue, Expression.Constant(null)), Expression.Assign(retExp, Expression.Convert(readExpValue, type)) diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index dc57c71d..853f849e 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -703,7 +703,7 @@ namespace FreeSql.Internal { //[typeof(JObject)] = true, //[typeof(JArray)] = true, }; - internal static ConcurrentDictionary> _dicExecuteArrayRowReadClassOrTuple = new ConcurrentDictionary>(); + internal static ConcurrentDictionary>> _dicExecuteArrayRowReadClassOrTuple = new ConcurrentDictionary>>(); internal class RowInfo { public object Value { get; set; } public int DataIndex { get; set; } @@ -716,8 +716,11 @@ namespace FreeSql.Internal { public static PropertyInfo PropertyDataIndex = typeof(RowInfo).GetProperty("DataIndex"); } internal static MethodInfo MethodDataReaderGetValue = typeof(DbDataReader).GetMethod("GetValue"); - internal static RowInfo ExecuteArrayRowReadClassOrTuple(Type typeOrg, int[] indexes, DbDataReader row, int dataIndex, CommonUtils _commonUtils) { - var func = _dicExecuteArrayRowReadClassOrTuple.GetOrAdd(typeOrg, type => { + internal static RowInfo ExecuteArrayRowReadClassOrTuple(string flagStr, Type typeOrg, int[] indexes, DbDataReader row, int dataIndex, CommonUtils _commonUtils) { + if (string.IsNullOrEmpty(flagStr)) flagStr = "all"; + var func = _dicExecuteArrayRowReadClassOrTuple + .GetOrAdd(flagStr, flag => new ConcurrentDictionary>()) + .GetOrAdd(typeOrg, type => { var returnTarget = Expression.Label(typeof(RowInfo)); var typeExp = Expression.Parameter(typeof(Type), "type"); var indexesExp = Expression.Parameter(typeof(int[]), "indexes"); @@ -770,7 +773,7 @@ namespace FreeSql.Internal { Expression.Add(dataIndexExp, Expression.Constant(1)) ); else { - read2ExpAssign = Expression.Call(MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(field.FieldType), indexesExp, rowExp, dataIndexExp, commonUtilExp }); + read2ExpAssign = Expression.Call(MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(flagStr), Expression.Constant(field.FieldType), indexesExp, rowExp, dataIndexExp, commonUtilExp }); } } block2Exp.AddRange(new Expression[] { @@ -887,7 +890,7 @@ namespace FreeSql.Internal { ); } else { readExpAssign = Expression.New(RowInfo.Constructor, - Expression.MakeMemberAccess(Expression.Call(MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(readType), indexesExp, rowExp, dataIndexExp, commonUtilExp }), RowInfo.PropertyValue), + Expression.MakeMemberAccess(Expression.Call(MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(flagStr), Expression.Constant(readType), indexesExp, rowExp, dataIndexExp, commonUtilExp }), RowInfo.PropertyValue), Expression.Add(dataIndexExp, Expression.Constant(1))); } } @@ -984,7 +987,7 @@ namespace FreeSql.Internal { } else { ++propIndex; continue; - //readExpAssign = Expression.Call(MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(readType), indexesExp, rowExp, tryidxExp }); + //readExpAssign = Expression.Call(MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(flagStr), Expression.Constant(readType), indexesExp, rowExp, tryidxExp }); } }