mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-06-18 12:03:21 +08:00
- 修改 Query/ToList 混合使用时,可能导致的 ET 缓存 bug;
This commit is contained in:
parent
be0f48b629
commit
79e21295c3
@ -2,7 +2,7 @@
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.0</TargetFramework>
|
||||
<Version>0.5.14</Version>
|
||||
<Version>0.5.15</Version>
|
||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||
<Authors>YeXiangQin</Authors>
|
||||
<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description>
|
||||
|
@ -85,16 +85,22 @@ namespace FreeSql.Internal.CommonProvider {
|
||||
var ret = new List<T>();
|
||||
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<string, int>(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<T1>(), new List<T2>());
|
||||
var ret1 = new List<T1>();
|
||||
var type1 = typeof(T1);
|
||||
string flag1 = null;
|
||||
int[] indexes1 = null;
|
||||
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
|
||||
|
||||
var ret2 = new List<T2>();
|
||||
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<string, int>(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<string, int>(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<T1>(), new List<T2>(), new List<T3>());
|
||||
var ret1 = new List<T1>();
|
||||
var type1 = typeof(T1);
|
||||
string flag1 = null;
|
||||
int[] indexes1 = null;
|
||||
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
|
||||
|
||||
var ret2 = new List<T2>();
|
||||
var type2 = typeof(T2);
|
||||
string flag2 = null;
|
||||
int[] indexes2 = null;
|
||||
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
|
||||
|
||||
var ret3 = new List<T3>();
|
||||
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<string, int>(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<string, int>(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<string, int>(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<T1>(), new List<T2>(), new List<T3>(), new List<T4>());
|
||||
var ret1 = new List<T1>();
|
||||
var type1 = typeof(T1);
|
||||
string flag1 = null;
|
||||
int[] indexes1 = null;
|
||||
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
|
||||
|
||||
var ret2 = new List<T2>();
|
||||
var type2 = typeof(T2);
|
||||
string flag2 = null;
|
||||
int[] indexes2 = null;
|
||||
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
|
||||
|
||||
var ret3 = new List<T3>();
|
||||
var type3 = typeof(T3);
|
||||
string flag3 = null;
|
||||
int[] indexes3 = null;
|
||||
var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
|
||||
|
||||
var ret4 = new List<T4>();
|
||||
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<string, int>(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<string, int>(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<string, int>(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<string, int>(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<T1>(), new List<T2>(), new List<T3>(), new List<T4>(), new List<T5>());
|
||||
var ret1 = new List<T1>();
|
||||
var type1 = typeof(T1);
|
||||
string flag1 = null;
|
||||
int[] indexes1 = null;
|
||||
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
|
||||
|
||||
var ret2 = new List<T2>();
|
||||
var type2 = typeof(T2);
|
||||
string flag2 = null;
|
||||
int[] indexes2 = null;
|
||||
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
|
||||
|
||||
var ret3 = new List<T3>();
|
||||
var type3 = typeof(T3);
|
||||
string flag3 = null;
|
||||
int[] indexes3 = null;
|
||||
var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
|
||||
|
||||
var ret4 = new List<T4>();
|
||||
var type4 = typeof(T4);
|
||||
string flag4 = null;
|
||||
int[] indexes4 = null;
|
||||
var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties());
|
||||
|
||||
var ret5 = new List<T5>();
|
||||
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<string, int>(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<string, int>(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<string, int>(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<string, int>(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<string, int>(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);
|
||||
|
@ -18,16 +18,22 @@ namespace FreeSql.Internal.CommonProvider {
|
||||
var ret = new List<T>();
|
||||
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<string, int>(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<T1>(), new List<T2>());
|
||||
var ret1 = new List<T1>();
|
||||
var type1 = typeof(T1);
|
||||
string flag1 = null;
|
||||
int[] indexes1 = null;
|
||||
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
|
||||
|
||||
var ret2 = new List<T2>();
|
||||
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<string, int>(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<string, int>(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<T1>(), new List<T2>(), new List<T3>());
|
||||
var ret1 = new List<T1>();
|
||||
var type1 = typeof(T1);
|
||||
string flag1 = null;
|
||||
int[] indexes1 = null;
|
||||
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
|
||||
|
||||
var ret2 = new List<T2>();
|
||||
var type2 = typeof(T2);
|
||||
string flag2 = null;
|
||||
int[] indexes2 = null;
|
||||
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
|
||||
|
||||
var ret3 = new List<T3>();
|
||||
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<string, int>(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<string, int>(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<string, int>(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<T1>(), new List<T2>(), new List<T3>(), new List<T4>());
|
||||
var ret1 = new List<T1>();
|
||||
var type1 = typeof(T1);
|
||||
string flag1 = null;
|
||||
int[] indexes1 = null;
|
||||
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
|
||||
|
||||
var ret2 = new List<T2>();
|
||||
var type2 = typeof(T2);
|
||||
string flag2 = null;
|
||||
int[] indexes2 = null;
|
||||
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
|
||||
|
||||
var ret3 = new List<T3>();
|
||||
var type3 = typeof(T3);
|
||||
string flag3 = null;
|
||||
int[] indexes3 = null;
|
||||
var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
|
||||
|
||||
var ret4 = new List<T4>();
|
||||
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<string, int>(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<string, int>(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<string, int>(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<string, int>(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<T1>(), new List<T2>(), new List<T3>(), new List<T4>(), new List<T5>());
|
||||
var ret1 = new List<T1>();
|
||||
var type1 = typeof(T1);
|
||||
string flag1 = null;
|
||||
int[] indexes1 = null;
|
||||
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
|
||||
|
||||
var ret2 = new List<T2>();
|
||||
var type2 = typeof(T2);
|
||||
string flag2 = null;
|
||||
int[] indexes2 = null;
|
||||
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
|
||||
|
||||
var ret3 = new List<T3>();
|
||||
var type3 = typeof(T3);
|
||||
string flag3 = null;
|
||||
int[] indexes3 = null;
|
||||
var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
|
||||
|
||||
var ret4 = new List<T4>();
|
||||
var type4 = typeof(T4);
|
||||
string flag4 = null;
|
||||
int[] indexes4 = null;
|
||||
var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties());
|
||||
|
||||
var ret5 = new List<T5>();
|
||||
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<string, int>(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<string, int>(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<string, int>(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<string, int>(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<string, int>(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;
|
||||
|
@ -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<TTuple>();
|
||||
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<TTuple>();
|
||||
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))
|
||||
|
@ -703,7 +703,7 @@ namespace FreeSql.Internal {
|
||||
//[typeof(JObject)] = 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 {
|
||||
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<Type, Func<Type, int[], DbDataReader, int, CommonUtils, RowInfo>>())
|
||||
.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 });
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user