mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	- 修改 Query/ToList 混合使用时,可能导致的 ET 缓存 bug;
This commit is contained in:
		@@ -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 });
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user