- 修改 Query/ToList 混合使用时,可能导致的 ET 缓存 bug;

This commit is contained in:
28810 2019-05-12 20:13:56 +08:00
parent be0f48b629
commit 79e21295c3
5 changed files with 288 additions and 103 deletions

View File

@ -2,7 +2,7 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<Version>0.5.14</Version> <Version>0.5.15</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>YeXiangQin</Authors> <Authors>YeXiangQin</Authors>
<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description> <Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description>

View File

@ -85,16 +85,22 @@ namespace FreeSql.Internal.CommonProvider {
var ret = new List<T>(); var ret = new List<T>();
if (string.IsNullOrEmpty(cmdText)) return ret; if (string.IsNullOrEmpty(cmdText)) return ret;
var type = typeof(T); var type = typeof(T);
string flag = null;
int[] indexes = null; int[] indexes = null;
var props = dicQueryTypeGetProperties.GetOrAdd(type, k => type.GetProperties()); var props = dicQueryTypeGetProperties.GetOrAdd(type, k => type.GetProperties());
ExecuteReader(connection, transaction, dr => { ExecuteReader(connection, transaction, dr => {
if (indexes == null) { if (indexes == null) {
var sbflag = new StringBuilder().Append("query");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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); }, cmdType, cmdText, cmdParms);
return ret; return ret;
} }
@ -108,32 +114,44 @@ namespace FreeSql.Internal.CommonProvider {
if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>()); if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>());
var ret1 = new List<T1>(); var ret1 = new List<T1>();
var type1 = typeof(T1); var type1 = typeof(T1);
string flag1 = null;
int[] indexes1 = null; int[] indexes1 = null;
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
var ret2 = new List<T2>(); var ret2 = new List<T2>();
var type2 = typeof(T2); var type2 = typeof(T2);
string flag2 = null;
int[] indexes2 = null; int[] indexes2 = null;
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
ExecuteReaderMultiple(2, connection, transaction, (dr, result) => { ExecuteReaderMultiple(2, connection, transaction, (dr, result) => {
switch(result) { switch(result) {
case 0: case 0:
if (indexes1 == null) { if (indexes1 == null) {
var sbflag = new StringBuilder().Append("query");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 1: case 1:
if (indexes2 == null) { if (indexes2 == null) {
var sbflag = new StringBuilder().Append("query");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
} }
}, cmdType, cmdText, cmdParms); }, cmdType, cmdText, cmdParms);
@ -149,46 +167,64 @@ namespace FreeSql.Internal.CommonProvider {
if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>()); if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>());
var ret1 = new List<T1>(); var ret1 = new List<T1>();
var type1 = typeof(T1); var type1 = typeof(T1);
string flag1 = null;
int[] indexes1 = null; int[] indexes1 = null;
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
var ret2 = new List<T2>(); var ret2 = new List<T2>();
var type2 = typeof(T2); var type2 = typeof(T2);
string flag2 = null;
int[] indexes2 = null; int[] indexes2 = null;
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
var ret3 = new List<T3>(); var ret3 = new List<T3>();
var type3 = typeof(T3); var type3 = typeof(T3);
string flag3 = null;
int[] indexes3 = null; int[] indexes3 = null;
var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties()); var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
ExecuteReaderMultiple(3, connection, transaction, (dr, result) => { ExecuteReaderMultiple(3, connection, transaction, (dr, result) => {
switch (result) { switch (result) {
case 0: case 0:
if (indexes1 == null) { if (indexes1 == null) {
var sbflag = new StringBuilder().Append("query");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 1: case 1:
if (indexes2 == null) { if (indexes2 == null) {
var sbflag = new StringBuilder().Append("query");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 2: case 2:
if (indexes3 == null) { if (indexes3 == null) {
var sbflag = new StringBuilder().Append("query");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
} }
}, cmdType, cmdText, cmdParms); }, cmdType, cmdText, cmdParms);
@ -204,60 +240,84 @@ namespace FreeSql.Internal.CommonProvider {
if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>()); if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>());
var ret1 = new List<T1>(); var ret1 = new List<T1>();
var type1 = typeof(T1); var type1 = typeof(T1);
string flag1 = null;
int[] indexes1 = null; int[] indexes1 = null;
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
var ret2 = new List<T2>(); var ret2 = new List<T2>();
var type2 = typeof(T2); var type2 = typeof(T2);
string flag2 = null;
int[] indexes2 = null; int[] indexes2 = null;
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
var ret3 = new List<T3>(); var ret3 = new List<T3>();
var type3 = typeof(T3); var type3 = typeof(T3);
string flag3 = null;
int[] indexes3 = null; int[] indexes3 = null;
var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties()); var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
var ret4 = new List<T4>(); var ret4 = new List<T4>();
var type4 = typeof(T4); var type4 = typeof(T4);
string flag4 = null;
int[] indexes4 = null; int[] indexes4 = null;
var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties()); var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties());
ExecuteReaderMultiple(4, connection, transaction, (dr, result) => { ExecuteReaderMultiple(4, connection, transaction, (dr, result) => {
switch (result) { switch (result) {
case 0: case 0:
if (indexes1 == null) { if (indexes1 == null) {
var sbflag = new StringBuilder().Append("query");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 1: case 1:
if (indexes2 == null) { if (indexes2 == null) {
var sbflag = new StringBuilder().Append("query");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 2: case 2:
if (indexes3 == null) { if (indexes3 == null) {
var sbflag = new StringBuilder().Append("query");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 3: case 3:
if (indexes4 == null) { if (indexes4 == null) {
var sbflag = new StringBuilder().Append("query");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
} }
}, cmdType, cmdText, cmdParms); }, cmdType, cmdText, cmdParms);
@ -273,74 +333,104 @@ namespace FreeSql.Internal.CommonProvider {
if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>(), new List<T5>()); if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>(), new List<T5>());
var ret1 = new List<T1>(); var ret1 = new List<T1>();
var type1 = typeof(T1); var type1 = typeof(T1);
string flag1 = null;
int[] indexes1 = null; int[] indexes1 = null;
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
var ret2 = new List<T2>(); var ret2 = new List<T2>();
var type2 = typeof(T2); var type2 = typeof(T2);
string flag2 = null;
int[] indexes2 = null; int[] indexes2 = null;
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
var ret3 = new List<T3>(); var ret3 = new List<T3>();
var type3 = typeof(T3); var type3 = typeof(T3);
string flag3 = null;
int[] indexes3 = null; int[] indexes3 = null;
var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties()); var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
var ret4 = new List<T4>(); var ret4 = new List<T4>();
var type4 = typeof(T4); var type4 = typeof(T4);
string flag4 = null;
int[] indexes4 = null; int[] indexes4 = null;
var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties()); var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties());
var ret5 = new List<T5>(); var ret5 = new List<T5>();
var type5 = typeof(T5); var type5 = typeof(T5);
string flag5 = null;
int[] indexes5 = null; int[] indexes5 = null;
var props5 = dicQueryTypeGetProperties.GetOrAdd(type5, k => type1.GetProperties()); var props5 = dicQueryTypeGetProperties.GetOrAdd(type5, k => type1.GetProperties());
ExecuteReaderMultiple(5, connection, transaction, (dr, result) => { ExecuteReaderMultiple(5, connection, transaction, (dr, result) => {
switch (result) { switch (result) {
case 0: case 0:
if (indexes1 == null) { if (indexes1 == null) {
var sbflag = new StringBuilder().Append("query");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 1: case 1:
if (indexes2 == null) { if (indexes2 == null) {
var sbflag = new StringBuilder().Append("query");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 2: case 2:
if (indexes3 == null) { if (indexes3 == null) {
var sbflag = new StringBuilder().Append("query");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 3: case 3:
if (indexes4 == null) { if (indexes4 == null) {
var sbflag = new StringBuilder().Append("query");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 4: case 4:
if (indexes5 == null) { if (indexes5 == null) {
var sbflag = new StringBuilder().Append("query");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
} }
}, cmdType, cmdText, cmdParms); }, cmdType, cmdText, cmdParms);

View File

@ -18,16 +18,22 @@ namespace FreeSql.Internal.CommonProvider {
var ret = new List<T>(); var ret = new List<T>();
if (string.IsNullOrEmpty(cmdText)) return ret; if (string.IsNullOrEmpty(cmdText)) return ret;
var type = typeof(T); var type = typeof(T);
string flag = null;
int[] indexes = null; int[] indexes = null;
var props = dicQueryTypeGetProperties.GetOrAdd(type, k => type.GetProperties()); var props = dicQueryTypeGetProperties.GetOrAdd(type, k => type.GetProperties());
await ExecuteReaderAsync(connection, transaction, dr => { await ExecuteReaderAsync(connection, transaction, dr => {
if (indexes == null) { if (indexes == null) {
var sbflag = new StringBuilder().Append("query");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; return Task.CompletedTask;
}, cmdType, cmdText, cmdParms); }, cmdType, cmdText, cmdParms);
return ret; return ret;
@ -42,32 +48,44 @@ namespace FreeSql.Internal.CommonProvider {
if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>()); if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>());
var ret1 = new List<T1>(); var ret1 = new List<T1>();
var type1 = typeof(T1); var type1 = typeof(T1);
string flag1 = null;
int[] indexes1 = null; int[] indexes1 = null;
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
var ret2 = new List<T2>(); var ret2 = new List<T2>();
var type2 = typeof(T2); var type2 = typeof(T2);
string flag2 = null;
int[] indexes2 = null; int[] indexes2 = null;
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
await ExecuteReaderMultipleAsync(2, connection, transaction, (dr, result) => { await ExecuteReaderMultipleAsync(2, connection, transaction, (dr, result) => {
switch (result) { switch (result) {
case 0: case 0:
if (indexes1 == null) { if (indexes1 == null) {
var sbflag = new StringBuilder().Append("QueryAsync");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 1: case 1:
if (indexes2 == null) { if (indexes2 == null) {
var sbflag = new StringBuilder().Append("QueryAsync");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
} }
return Task.CompletedTask; return Task.CompletedTask;
@ -84,46 +102,64 @@ namespace FreeSql.Internal.CommonProvider {
if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>()); if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>());
var ret1 = new List<T1>(); var ret1 = new List<T1>();
var type1 = typeof(T1); var type1 = typeof(T1);
string flag1 = null;
int[] indexes1 = null; int[] indexes1 = null;
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
var ret2 = new List<T2>(); var ret2 = new List<T2>();
var type2 = typeof(T2); var type2 = typeof(T2);
string flag2 = null;
int[] indexes2 = null; int[] indexes2 = null;
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
var ret3 = new List<T3>(); var ret3 = new List<T3>();
var type3 = typeof(T3); var type3 = typeof(T3);
string flag3 = null;
int[] indexes3 = null; int[] indexes3 = null;
var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties()); var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
await ExecuteReaderMultipleAsync(3, connection, transaction, (dr, result) => { await ExecuteReaderMultipleAsync(3, connection, transaction, (dr, result) => {
switch (result) { switch (result) {
case 0: case 0:
if (indexes1 == null) { if (indexes1 == null) {
var sbflag = new StringBuilder().Append("QueryAsync");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 1: case 1:
if (indexes2 == null) { if (indexes2 == null) {
var sbflag = new StringBuilder().Append("QueryAsync");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 2: case 2:
if (indexes3 == null) { if (indexes3 == null) {
var sbflag = new StringBuilder().Append("QueryAsync");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
} }
return Task.CompletedTask; return Task.CompletedTask;
@ -140,60 +176,84 @@ namespace FreeSql.Internal.CommonProvider {
if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>()); if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>());
var ret1 = new List<T1>(); var ret1 = new List<T1>();
var type1 = typeof(T1); var type1 = typeof(T1);
string flag1 = null;
int[] indexes1 = null; int[] indexes1 = null;
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
var ret2 = new List<T2>(); var ret2 = new List<T2>();
var type2 = typeof(T2); var type2 = typeof(T2);
string flag2 = null;
int[] indexes2 = null; int[] indexes2 = null;
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
var ret3 = new List<T3>(); var ret3 = new List<T3>();
var type3 = typeof(T3); var type3 = typeof(T3);
string flag3 = null;
int[] indexes3 = null; int[] indexes3 = null;
var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties()); var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
var ret4 = new List<T4>(); var ret4 = new List<T4>();
var type4 = typeof(T4); var type4 = typeof(T4);
string flag4 = null;
int[] indexes4 = null; int[] indexes4 = null;
var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties()); var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties());
await ExecuteReaderMultipleAsync(4, connection, transaction, (dr, result) => { await ExecuteReaderMultipleAsync(4, connection, transaction, (dr, result) => {
switch (result) { switch (result) {
case 0: case 0:
if (indexes1 == null) { if (indexes1 == null) {
var sbflag = new StringBuilder().Append("QueryAsync");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 1: case 1:
if (indexes2 == null) { if (indexes2 == null) {
var sbflag = new StringBuilder().Append("QueryAsync");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 2: case 2:
if (indexes3 == null) { if (indexes3 == null) {
var sbflag = new StringBuilder().Append("QueryAsync");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 3: case 3:
if (indexes4 == null) { if (indexes4 == null) {
var sbflag = new StringBuilder().Append("QueryAsync");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
} }
return Task.CompletedTask; return Task.CompletedTask;
@ -210,74 +270,104 @@ namespace FreeSql.Internal.CommonProvider {
if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>(), new List<T5>()); if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>(), new List<T5>());
var ret1 = new List<T1>(); var ret1 = new List<T1>();
var type1 = typeof(T1); var type1 = typeof(T1);
string flag1 = null;
int[] indexes1 = null; int[] indexes1 = null;
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
var ret2 = new List<T2>(); var ret2 = new List<T2>();
var type2 = typeof(T2); var type2 = typeof(T2);
string flag2 = null;
int[] indexes2 = null; int[] indexes2 = null;
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
var ret3 = new List<T3>(); var ret3 = new List<T3>();
var type3 = typeof(T3); var type3 = typeof(T3);
string flag3 = null;
int[] indexes3 = null; int[] indexes3 = null;
var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties()); var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
var ret4 = new List<T4>(); var ret4 = new List<T4>();
var type4 = typeof(T4); var type4 = typeof(T4);
string flag4 = null;
int[] indexes4 = null; int[] indexes4 = null;
var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties()); var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties());
var ret5 = new List<T5>(); var ret5 = new List<T5>();
var type5 = typeof(T5); var type5 = typeof(T5);
string flag5 = null;
int[] indexes5 = null; int[] indexes5 = null;
var props5 = dicQueryTypeGetProperties.GetOrAdd(type5, k => type1.GetProperties()); var props5 = dicQueryTypeGetProperties.GetOrAdd(type5, k => type1.GetProperties());
await ExecuteReaderMultipleAsync(5, connection, transaction, (dr, result) => { await ExecuteReaderMultipleAsync(5, connection, transaction, (dr, result) => {
switch (result) { switch (result) {
case 0: case 0:
if (indexes1 == null) { if (indexes1 == null) {
var sbflag = new StringBuilder().Append("QueryAsync");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 1: case 1:
if (indexes2 == null) { if (indexes2 == null) {
var sbflag = new StringBuilder().Append("QueryAsync");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 2: case 2:
if (indexes3 == null) { if (indexes3 == null) {
var sbflag = new StringBuilder().Append("QueryAsync");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 3: case 3:
if (indexes4 == null) { if (indexes4 == null) {
var sbflag = new StringBuilder().Append("QueryAsync");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
case 4: case 4:
if (indexes5 == null) { if (indexes5 == null) {
var sbflag = new StringBuilder().Append("QueryAsync");
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
for (var a = 0; a < dr.FieldCount; a++) for (var a = 0; a < dr.FieldCount; a++) {
dic.Add(dr.GetName(a), 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(); 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; break;
} }
return Task.CompletedTask; return Task.CompletedTask;

View File

@ -273,10 +273,11 @@ namespace FreeSql.Internal.CommonProvider {
var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms); var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms);
_orm.Aop.CurdBefore?.Invoke(this, before); _orm.Aop.CurdBefore?.Invoke(this, before);
var ret = new List<TTuple>(); var ret = new List<TTuple>();
var flagStr = $"ToListField:{field}";
Exception exception = null; Exception exception = null;
try { try {
_orm.Ado.ExecuteReader(_connection, _transaction, dr => { _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); ret.Add((TTuple)read.Value);
}, CommandType.Text, sql, dbParms); }, CommandType.Text, sql, dbParms);
} catch (Exception ex) { } 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); var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms);
_orm.Aop.CurdBefore?.Invoke(this, before); _orm.Aop.CurdBefore?.Invoke(this, before);
var ret = new List<TTuple>(); var ret = new List<TTuple>();
var flagStr = $"ToListField:{field}";
Exception exception = null; Exception exception = null;
try { try {
await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => { 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); ret.Add((TTuple)read.Value);
return Task.CompletedTask; return Task.CompletedTask;
}, CommandType.Text, sql, dbParms); }, CommandType.Text, sql, dbParms);
@ -537,7 +539,7 @@ namespace FreeSql.Internal.CommonProvider {
if (tbiindex == 0) if (tbiindex == 0)
blockExp.AddRange(new Expression[] { 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.IfThen(
Expression.GreaterThan(readExpDataIndex, dataIndexExp), Expression.GreaterThan(readExpDataIndex, dataIndexExp),
Expression.Assign(dataIndexExp, readExpDataIndex) Expression.Assign(dataIndexExp, readExpDataIndex)
@ -577,7 +579,7 @@ namespace FreeSql.Internal.CommonProvider {
Expression.IfThenElse( Expression.IfThenElse(
curExpIfNotNull, curExpIfNotNull,
Expression.Block(new Expression[] { 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.IfThen(
Expression.GreaterThan(readExpDataIndex, dataIndexExp), Expression.GreaterThan(readExpDataIndex, dataIndexExp),
Expression.Assign(dataIndexExp, readExpDataIndex) Expression.Assign(dataIndexExp, readExpDataIndex)
@ -694,7 +696,7 @@ namespace FreeSql.Internal.CommonProvider {
Expression.Add(dataIndexExp, Expression.Constant(1)) Expression.Add(dataIndexExp, Expression.Constant(1))
); );
else { 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[] { blockExp.AddRange(new Expression[] {
@ -719,7 +721,7 @@ namespace FreeSql.Internal.CommonProvider {
blockExp.Clear(); blockExp.Clear();
blockExp.AddRange(new Expression[] { blockExp.AddRange(new Expression[] {
Expression.Assign(dataIndexExp, Expression.Constant(0)), 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.IfThen(
Expression.NotEqual(readExpValue, Expression.Constant(null)), Expression.NotEqual(readExpValue, Expression.Constant(null)),
Expression.Assign(retExp, Expression.Convert(readExpValue, type)) Expression.Assign(retExp, Expression.Convert(readExpValue, type))

View File

@ -703,7 +703,7 @@ namespace FreeSql.Internal {
//[typeof(JObject)] = true, //[typeof(JObject)] = true,
//[typeof(JArray)] = true, //[typeof(JArray)] = true,
}; };
internal static ConcurrentDictionary<Type, Func<Type, int[], DbDataReader, int, CommonUtils, RowInfo>> _dicExecuteArrayRowReadClassOrTuple = new ConcurrentDictionary<Type, Func<Type, int[], DbDataReader, int, CommonUtils, RowInfo>>(); internal static ConcurrentDictionary<string, ConcurrentDictionary<Type, Func<Type, int[], DbDataReader, int, CommonUtils, RowInfo>>> _dicExecuteArrayRowReadClassOrTuple = new ConcurrentDictionary<string, ConcurrentDictionary<Type, Func<Type, int[], DbDataReader, int, CommonUtils, RowInfo>>>();
internal class RowInfo { internal class RowInfo {
public object Value { get; set; } public object Value { get; set; }
public int DataIndex { get; set; } public int DataIndex { get; set; }
@ -716,8 +716,11 @@ namespace FreeSql.Internal {
public static PropertyInfo PropertyDataIndex = typeof(RowInfo).GetProperty("DataIndex"); public static PropertyInfo PropertyDataIndex = typeof(RowInfo).GetProperty("DataIndex");
} }
internal static MethodInfo MethodDataReaderGetValue = typeof(DbDataReader).GetMethod("GetValue"); internal static MethodInfo MethodDataReaderGetValue = typeof(DbDataReader).GetMethod("GetValue");
internal static RowInfo ExecuteArrayRowReadClassOrTuple(Type typeOrg, int[] indexes, DbDataReader row, int dataIndex, CommonUtils _commonUtils) { internal static RowInfo ExecuteArrayRowReadClassOrTuple(string flagStr, Type typeOrg, int[] indexes, DbDataReader row, int dataIndex, CommonUtils _commonUtils) {
var func = _dicExecuteArrayRowReadClassOrTuple.GetOrAdd(typeOrg, type => { if (string.IsNullOrEmpty(flagStr)) flagStr = "all";
var func = _dicExecuteArrayRowReadClassOrTuple
.GetOrAdd(flagStr, flag => new ConcurrentDictionary<Type, Func<Type, int[], DbDataReader, int, CommonUtils, RowInfo>>())
.GetOrAdd(typeOrg, type => {
var returnTarget = Expression.Label(typeof(RowInfo)); var returnTarget = Expression.Label(typeof(RowInfo));
var typeExp = Expression.Parameter(typeof(Type), "type"); var typeExp = Expression.Parameter(typeof(Type), "type");
var indexesExp = Expression.Parameter(typeof(int[]), "indexes"); var indexesExp = Expression.Parameter(typeof(int[]), "indexes");
@ -770,7 +773,7 @@ namespace FreeSql.Internal {
Expression.Add(dataIndexExp, Expression.Constant(1)) Expression.Add(dataIndexExp, Expression.Constant(1))
); );
else { 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[] { block2Exp.AddRange(new Expression[] {
@ -887,7 +890,7 @@ namespace FreeSql.Internal {
); );
} else { } else {
readExpAssign = Expression.New(RowInfo.Constructor, 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))); Expression.Add(dataIndexExp, Expression.Constant(1)));
} }
} }
@ -984,7 +987,7 @@ namespace FreeSql.Internal {
} else { } else {
++propIndex; ++propIndex;
continue; 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 });
} }
} }