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:
		@@ -2,7 +2,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	<PropertyGroup>
 | 
						<PropertyGroup>
 | 
				
			||||||
		<TargetFramework>netstandard2.0</TargetFramework>
 | 
							<TargetFramework>netstandard2.0</TargetFramework>
 | 
				
			||||||
		<Version>0.5.14</Version>
 | 
							<Version>0.5.15</Version>
 | 
				
			||||||
		<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
 | 
							<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
 | 
				
			||||||
		<Authors>YeXiangQin</Authors>
 | 
							<Authors>YeXiangQin</Authors>
 | 
				
			||||||
		<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description>
 | 
							<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -85,16 +85,22 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			var ret = new List<T>();
 | 
								var ret = new List<T>();
 | 
				
			||||||
			if (string.IsNullOrEmpty(cmdText)) return ret;
 | 
								if (string.IsNullOrEmpty(cmdText)) return ret;
 | 
				
			||||||
			var type = typeof(T);
 | 
								var type = typeof(T);
 | 
				
			||||||
 | 
								string flag = null;
 | 
				
			||||||
			int[] indexes = null;
 | 
								int[] indexes = null;
 | 
				
			||||||
			var props = dicQueryTypeGetProperties.GetOrAdd(type, k => type.GetProperties());
 | 
								var props = dicQueryTypeGetProperties.GetOrAdd(type, k => type.GetProperties());
 | 
				
			||||||
			ExecuteReader(connection, transaction, dr => {
 | 
								ExecuteReader(connection, transaction, dr => {
 | 
				
			||||||
				if (indexes == null) {
 | 
									if (indexes == null) {
 | 
				
			||||||
 | 
										var sbflag = new StringBuilder().Append("query");
 | 
				
			||||||
					var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
										var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
					for (var a = 0; a < dr.FieldCount; a++)
 | 
										for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
						dic.Add(dr.GetName(a), a);
 | 
											var name = dr.GetName(a);
 | 
				
			||||||
 | 
											sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
											dic.Add(name, a);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
					indexes = props.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
										indexes = props.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
										flag = sbflag.ToString();
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				ret.Add((T)Utils.ExecuteArrayRowReadClassOrTuple(type, indexes, dr, 0, _util).Value);
 | 
									ret.Add((T)Utils.ExecuteArrayRowReadClassOrTuple(flag, type, indexes, dr, 0, _util).Value);
 | 
				
			||||||
			}, cmdType, cmdText, cmdParms);
 | 
								}, cmdType, cmdText, cmdParms);
 | 
				
			||||||
			return ret;
 | 
								return ret;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -108,32 +114,44 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>());
 | 
								if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>());
 | 
				
			||||||
			var ret1 = new List<T1>();
 | 
								var ret1 = new List<T1>();
 | 
				
			||||||
			var type1 = typeof(T1);
 | 
								var type1 = typeof(T1);
 | 
				
			||||||
 | 
								string flag1 = null;
 | 
				
			||||||
			int[] indexes1 = null;
 | 
								int[] indexes1 = null;
 | 
				
			||||||
			var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
 | 
								var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret2 = new List<T2>();
 | 
								var ret2 = new List<T2>();
 | 
				
			||||||
			var type2 = typeof(T2);
 | 
								var type2 = typeof(T2);
 | 
				
			||||||
 | 
								string flag2 = null;
 | 
				
			||||||
			int[] indexes2 = null;
 | 
								int[] indexes2 = null;
 | 
				
			||||||
			var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
 | 
								var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
 | 
				
			||||||
			ExecuteReaderMultiple(2, connection, transaction, (dr, result) => {
 | 
								ExecuteReaderMultiple(2, connection, transaction, (dr, result) => {
 | 
				
			||||||
				switch(result) {
 | 
									switch(result) {
 | 
				
			||||||
					case 0:
 | 
										case 0:
 | 
				
			||||||
						if (indexes1 == null) {
 | 
											if (indexes1 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("query");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag1 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value);
 | 
											ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 1:
 | 
										case 1:
 | 
				
			||||||
						if (indexes2 == null) {
 | 
											if (indexes2 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("query");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag2 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value);
 | 
											ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}, cmdType, cmdText, cmdParms);
 | 
								}, cmdType, cmdText, cmdParms);
 | 
				
			||||||
@@ -149,46 +167,64 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>());
 | 
								if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>());
 | 
				
			||||||
			var ret1 = new List<T1>();
 | 
								var ret1 = new List<T1>();
 | 
				
			||||||
			var type1 = typeof(T1);
 | 
								var type1 = typeof(T1);
 | 
				
			||||||
 | 
								string flag1 = null;
 | 
				
			||||||
			int[] indexes1 = null;
 | 
								int[] indexes1 = null;
 | 
				
			||||||
			var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
 | 
								var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret2 = new List<T2>();
 | 
								var ret2 = new List<T2>();
 | 
				
			||||||
			var type2 = typeof(T2);
 | 
								var type2 = typeof(T2);
 | 
				
			||||||
 | 
								string flag2 = null;
 | 
				
			||||||
			int[] indexes2 = null;
 | 
								int[] indexes2 = null;
 | 
				
			||||||
			var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
 | 
								var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret3 = new List<T3>();
 | 
								var ret3 = new List<T3>();
 | 
				
			||||||
			var type3 = typeof(T3);
 | 
								var type3 = typeof(T3);
 | 
				
			||||||
 | 
								string flag3 = null;
 | 
				
			||||||
			int[] indexes3 = null;
 | 
								int[] indexes3 = null;
 | 
				
			||||||
			var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
 | 
								var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
 | 
				
			||||||
			ExecuteReaderMultiple(3, connection, transaction, (dr, result) => {
 | 
								ExecuteReaderMultiple(3, connection, transaction, (dr, result) => {
 | 
				
			||||||
				switch (result) {
 | 
									switch (result) {
 | 
				
			||||||
					case 0:
 | 
										case 0:
 | 
				
			||||||
						if (indexes1 == null) {
 | 
											if (indexes1 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("query");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag1 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value);
 | 
											ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 1:
 | 
										case 1:
 | 
				
			||||||
						if (indexes2 == null) {
 | 
											if (indexes2 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("query");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag2 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value);
 | 
											ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 2:
 | 
										case 2:
 | 
				
			||||||
						if (indexes3 == null) {
 | 
											if (indexes3 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("query");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag3 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(type3, indexes3, dr, 0, _util).Value);
 | 
											ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}, cmdType, cmdText, cmdParms);
 | 
								}, cmdType, cmdText, cmdParms);
 | 
				
			||||||
@@ -204,60 +240,84 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>());
 | 
								if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>());
 | 
				
			||||||
			var ret1 = new List<T1>();
 | 
								var ret1 = new List<T1>();
 | 
				
			||||||
			var type1 = typeof(T1);
 | 
								var type1 = typeof(T1);
 | 
				
			||||||
 | 
								string flag1 = null;
 | 
				
			||||||
			int[] indexes1 = null;
 | 
								int[] indexes1 = null;
 | 
				
			||||||
			var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
 | 
								var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret2 = new List<T2>();
 | 
								var ret2 = new List<T2>();
 | 
				
			||||||
			var type2 = typeof(T2);
 | 
								var type2 = typeof(T2);
 | 
				
			||||||
 | 
								string flag2 = null;
 | 
				
			||||||
			int[] indexes2 = null;
 | 
								int[] indexes2 = null;
 | 
				
			||||||
			var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
 | 
								var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret3 = new List<T3>();
 | 
								var ret3 = new List<T3>();
 | 
				
			||||||
			var type3 = typeof(T3);
 | 
								var type3 = typeof(T3);
 | 
				
			||||||
 | 
								string flag3 = null;
 | 
				
			||||||
			int[] indexes3 = null;
 | 
								int[] indexes3 = null;
 | 
				
			||||||
			var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
 | 
								var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret4 = new List<T4>();
 | 
								var ret4 = new List<T4>();
 | 
				
			||||||
			var type4 = typeof(T4);
 | 
								var type4 = typeof(T4);
 | 
				
			||||||
 | 
								string flag4 = null;
 | 
				
			||||||
			int[] indexes4 = null;
 | 
								int[] indexes4 = null;
 | 
				
			||||||
			var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties());
 | 
								var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties());
 | 
				
			||||||
			ExecuteReaderMultiple(4, connection, transaction, (dr, result) => {
 | 
								ExecuteReaderMultiple(4, connection, transaction, (dr, result) => {
 | 
				
			||||||
				switch (result) {
 | 
									switch (result) {
 | 
				
			||||||
					case 0:
 | 
										case 0:
 | 
				
			||||||
						if (indexes1 == null) {
 | 
											if (indexes1 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("query");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag1 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value);
 | 
											ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 1:
 | 
										case 1:
 | 
				
			||||||
						if (indexes2 == null) {
 | 
											if (indexes2 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("query");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag2 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value);
 | 
											ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 2:
 | 
										case 2:
 | 
				
			||||||
						if (indexes3 == null) {
 | 
											if (indexes3 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("query");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag3 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(type3, indexes3, dr, 0, _util).Value);
 | 
											ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 3:
 | 
										case 3:
 | 
				
			||||||
						if (indexes4 == null) {
 | 
											if (indexes4 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("query");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes4 = props4.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes4 = props4.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag4 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(type4, indexes4, dr, 0, _util).Value);
 | 
											ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(flag4, type4, indexes4, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}, cmdType, cmdText, cmdParms);
 | 
								}, cmdType, cmdText, cmdParms);
 | 
				
			||||||
@@ -273,74 +333,104 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>(), new List<T5>());
 | 
								if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>(), new List<T5>());
 | 
				
			||||||
			var ret1 = new List<T1>();
 | 
								var ret1 = new List<T1>();
 | 
				
			||||||
			var type1 = typeof(T1);
 | 
								var type1 = typeof(T1);
 | 
				
			||||||
 | 
								string flag1 = null;
 | 
				
			||||||
			int[] indexes1 = null;
 | 
								int[] indexes1 = null;
 | 
				
			||||||
			var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
 | 
								var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret2 = new List<T2>();
 | 
								var ret2 = new List<T2>();
 | 
				
			||||||
			var type2 = typeof(T2);
 | 
								var type2 = typeof(T2);
 | 
				
			||||||
 | 
								string flag2 = null;
 | 
				
			||||||
			int[] indexes2 = null;
 | 
								int[] indexes2 = null;
 | 
				
			||||||
			var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
 | 
								var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret3 = new List<T3>();
 | 
								var ret3 = new List<T3>();
 | 
				
			||||||
			var type3 = typeof(T3);
 | 
								var type3 = typeof(T3);
 | 
				
			||||||
 | 
								string flag3 = null;
 | 
				
			||||||
			int[] indexes3 = null;
 | 
								int[] indexes3 = null;
 | 
				
			||||||
			var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
 | 
								var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret4 = new List<T4>();
 | 
								var ret4 = new List<T4>();
 | 
				
			||||||
			var type4 = typeof(T4);
 | 
								var type4 = typeof(T4);
 | 
				
			||||||
 | 
								string flag4 = null;
 | 
				
			||||||
			int[] indexes4 = null;
 | 
								int[] indexes4 = null;
 | 
				
			||||||
			var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties());
 | 
								var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret5 = new List<T5>();
 | 
								var ret5 = new List<T5>();
 | 
				
			||||||
			var type5 = typeof(T5);
 | 
								var type5 = typeof(T5);
 | 
				
			||||||
 | 
								string flag5 = null;
 | 
				
			||||||
			int[] indexes5 = null;
 | 
								int[] indexes5 = null;
 | 
				
			||||||
			var props5 = dicQueryTypeGetProperties.GetOrAdd(type5, k => type1.GetProperties());
 | 
								var props5 = dicQueryTypeGetProperties.GetOrAdd(type5, k => type1.GetProperties());
 | 
				
			||||||
			ExecuteReaderMultiple(5, connection, transaction, (dr, result) => {
 | 
								ExecuteReaderMultiple(5, connection, transaction, (dr, result) => {
 | 
				
			||||||
				switch (result) {
 | 
									switch (result) {
 | 
				
			||||||
					case 0:
 | 
										case 0:
 | 
				
			||||||
						if (indexes1 == null) {
 | 
											if (indexes1 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("query");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag1 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value);
 | 
											ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 1:
 | 
										case 1:
 | 
				
			||||||
						if (indexes2 == null) {
 | 
											if (indexes2 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("query");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag2 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value);
 | 
											ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 2:
 | 
										case 2:
 | 
				
			||||||
						if (indexes3 == null) {
 | 
											if (indexes3 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("query");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag3 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(type3, indexes3, dr, 0, _util).Value);
 | 
											ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 3:
 | 
										case 3:
 | 
				
			||||||
						if (indexes4 == null) {
 | 
											if (indexes4 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("query");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes4 = props4.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes4 = props4.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag4 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(type4, indexes4, dr, 0, _util).Value);
 | 
											ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(flag4, type4, indexes4, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 4:
 | 
										case 4:
 | 
				
			||||||
						if (indexes5 == null) {
 | 
											if (indexes5 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("query");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes5 = props5.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes5 = props5.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag5 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret5.Add((T5)Utils.ExecuteArrayRowReadClassOrTuple(type5, indexes5, dr, 0, _util).Value);
 | 
											ret5.Add((T5)Utils.ExecuteArrayRowReadClassOrTuple(flag5, type5, indexes5, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}, cmdType, cmdText, cmdParms);
 | 
								}, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,16 +18,22 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			var ret = new List<T>();
 | 
								var ret = new List<T>();
 | 
				
			||||||
			if (string.IsNullOrEmpty(cmdText)) return ret;
 | 
								if (string.IsNullOrEmpty(cmdText)) return ret;
 | 
				
			||||||
			var type = typeof(T);
 | 
								var type = typeof(T);
 | 
				
			||||||
 | 
								string flag = null;
 | 
				
			||||||
			int[] indexes = null;
 | 
								int[] indexes = null;
 | 
				
			||||||
			var props = dicQueryTypeGetProperties.GetOrAdd(type, k => type.GetProperties());
 | 
								var props = dicQueryTypeGetProperties.GetOrAdd(type, k => type.GetProperties());
 | 
				
			||||||
			await ExecuteReaderAsync(connection, transaction, dr => {
 | 
								await ExecuteReaderAsync(connection, transaction, dr => {
 | 
				
			||||||
				if (indexes == null) {
 | 
									if (indexes == null) {
 | 
				
			||||||
 | 
										var sbflag = new StringBuilder().Append("query");
 | 
				
			||||||
					var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
										var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
					for (var a = 0; a < dr.FieldCount; a++)
 | 
										for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
						dic.Add(dr.GetName(a), a);
 | 
											var name = dr.GetName(a);
 | 
				
			||||||
 | 
											sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
											dic.Add(name, a);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
					indexes = props.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
										indexes = props.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
										flag = sbflag.ToString();
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				ret.Add((T)Utils.ExecuteArrayRowReadClassOrTuple(type, indexes, dr, 0, _util).Value);
 | 
									ret.Add((T)Utils.ExecuteArrayRowReadClassOrTuple(flag, type, indexes, dr, 0, _util).Value);
 | 
				
			||||||
				return Task.CompletedTask;
 | 
									return Task.CompletedTask;
 | 
				
			||||||
			}, cmdType, cmdText, cmdParms);
 | 
								}, cmdType, cmdText, cmdParms);
 | 
				
			||||||
			return ret;
 | 
								return ret;
 | 
				
			||||||
@@ -42,32 +48,44 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>());
 | 
								if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>());
 | 
				
			||||||
			var ret1 = new List<T1>();
 | 
								var ret1 = new List<T1>();
 | 
				
			||||||
			var type1 = typeof(T1);
 | 
								var type1 = typeof(T1);
 | 
				
			||||||
 | 
								string flag1 = null;
 | 
				
			||||||
			int[] indexes1 = null;
 | 
								int[] indexes1 = null;
 | 
				
			||||||
			var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
 | 
								var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret2 = new List<T2>();
 | 
								var ret2 = new List<T2>();
 | 
				
			||||||
			var type2 = typeof(T2);
 | 
								var type2 = typeof(T2);
 | 
				
			||||||
 | 
								string flag2 = null;
 | 
				
			||||||
			int[] indexes2 = null;
 | 
								int[] indexes2 = null;
 | 
				
			||||||
			var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
 | 
								var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
 | 
				
			||||||
			await ExecuteReaderMultipleAsync(2, connection, transaction, (dr, result) => {
 | 
								await ExecuteReaderMultipleAsync(2, connection, transaction, (dr, result) => {
 | 
				
			||||||
				switch (result) {
 | 
									switch (result) {
 | 
				
			||||||
					case 0:
 | 
										case 0:
 | 
				
			||||||
						if (indexes1 == null) {
 | 
											if (indexes1 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("QueryAsync");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag1 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value);
 | 
											ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 1:
 | 
										case 1:
 | 
				
			||||||
						if (indexes2 == null) {
 | 
											if (indexes2 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("QueryAsync");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag2 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value);
 | 
											ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				return Task.CompletedTask;
 | 
									return Task.CompletedTask;
 | 
				
			||||||
@@ -84,46 +102,64 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>());
 | 
								if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>());
 | 
				
			||||||
			var ret1 = new List<T1>();
 | 
								var ret1 = new List<T1>();
 | 
				
			||||||
			var type1 = typeof(T1);
 | 
								var type1 = typeof(T1);
 | 
				
			||||||
 | 
								string flag1 = null;
 | 
				
			||||||
			int[] indexes1 = null;
 | 
								int[] indexes1 = null;
 | 
				
			||||||
			var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
 | 
								var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret2 = new List<T2>();
 | 
								var ret2 = new List<T2>();
 | 
				
			||||||
			var type2 = typeof(T2);
 | 
								var type2 = typeof(T2);
 | 
				
			||||||
 | 
								string flag2 = null;
 | 
				
			||||||
			int[] indexes2 = null;
 | 
								int[] indexes2 = null;
 | 
				
			||||||
			var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
 | 
								var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret3 = new List<T3>();
 | 
								var ret3 = new List<T3>();
 | 
				
			||||||
			var type3 = typeof(T3);
 | 
								var type3 = typeof(T3);
 | 
				
			||||||
 | 
								string flag3 = null;
 | 
				
			||||||
			int[] indexes3 = null;
 | 
								int[] indexes3 = null;
 | 
				
			||||||
			var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
 | 
								var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
 | 
				
			||||||
			await ExecuteReaderMultipleAsync(3, connection, transaction, (dr, result) => {
 | 
								await ExecuteReaderMultipleAsync(3, connection, transaction, (dr, result) => {
 | 
				
			||||||
				switch (result) {
 | 
									switch (result) {
 | 
				
			||||||
					case 0:
 | 
										case 0:
 | 
				
			||||||
						if (indexes1 == null) {
 | 
											if (indexes1 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("QueryAsync");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag1 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value);
 | 
											ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 1:
 | 
										case 1:
 | 
				
			||||||
						if (indexes2 == null) {
 | 
											if (indexes2 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("QueryAsync");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag2 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value);
 | 
											ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 2:
 | 
										case 2:
 | 
				
			||||||
						if (indexes3 == null) {
 | 
											if (indexes3 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("QueryAsync");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag3 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(type3, indexes3, dr, 0, _util).Value);
 | 
											ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				return Task.CompletedTask;
 | 
									return Task.CompletedTask;
 | 
				
			||||||
@@ -140,60 +176,84 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>());
 | 
								if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>());
 | 
				
			||||||
			var ret1 = new List<T1>();
 | 
								var ret1 = new List<T1>();
 | 
				
			||||||
			var type1 = typeof(T1);
 | 
								var type1 = typeof(T1);
 | 
				
			||||||
 | 
								string flag1 = null;
 | 
				
			||||||
			int[] indexes1 = null;
 | 
								int[] indexes1 = null;
 | 
				
			||||||
			var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
 | 
								var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret2 = new List<T2>();
 | 
								var ret2 = new List<T2>();
 | 
				
			||||||
			var type2 = typeof(T2);
 | 
								var type2 = typeof(T2);
 | 
				
			||||||
 | 
								string flag2 = null;
 | 
				
			||||||
			int[] indexes2 = null;
 | 
								int[] indexes2 = null;
 | 
				
			||||||
			var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
 | 
								var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret3 = new List<T3>();
 | 
								var ret3 = new List<T3>();
 | 
				
			||||||
			var type3 = typeof(T3);
 | 
								var type3 = typeof(T3);
 | 
				
			||||||
 | 
								string flag3 = null;
 | 
				
			||||||
			int[] indexes3 = null;
 | 
								int[] indexes3 = null;
 | 
				
			||||||
			var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
 | 
								var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret4 = new List<T4>();
 | 
								var ret4 = new List<T4>();
 | 
				
			||||||
			var type4 = typeof(T4);
 | 
								var type4 = typeof(T4);
 | 
				
			||||||
 | 
								string flag4 = null;
 | 
				
			||||||
			int[] indexes4 = null;
 | 
								int[] indexes4 = null;
 | 
				
			||||||
			var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties());
 | 
								var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties());
 | 
				
			||||||
			await ExecuteReaderMultipleAsync(4, connection, transaction, (dr, result) => {
 | 
								await ExecuteReaderMultipleAsync(4, connection, transaction, (dr, result) => {
 | 
				
			||||||
				switch (result) {
 | 
									switch (result) {
 | 
				
			||||||
					case 0:
 | 
										case 0:
 | 
				
			||||||
						if (indexes1 == null) {
 | 
											if (indexes1 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("QueryAsync");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag1 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value);
 | 
											ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 1:
 | 
										case 1:
 | 
				
			||||||
						if (indexes2 == null) {
 | 
											if (indexes2 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("QueryAsync");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag2 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value);
 | 
											ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 2:
 | 
										case 2:
 | 
				
			||||||
						if (indexes3 == null) {
 | 
											if (indexes3 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("QueryAsync");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag3 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(type3, indexes3, dr, 0, _util).Value);
 | 
											ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 3:
 | 
										case 3:
 | 
				
			||||||
						if (indexes4 == null) {
 | 
											if (indexes4 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("QueryAsync");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes4 = props4.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes4 = props4.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag4 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(type4, indexes4, dr, 0, _util).Value);
 | 
											ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(flag4, type4, indexes4, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				return Task.CompletedTask;
 | 
									return Task.CompletedTask;
 | 
				
			||||||
@@ -210,74 +270,104 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>(), new List<T5>());
 | 
								if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>(), new List<T5>());
 | 
				
			||||||
			var ret1 = new List<T1>();
 | 
								var ret1 = new List<T1>();
 | 
				
			||||||
			var type1 = typeof(T1);
 | 
								var type1 = typeof(T1);
 | 
				
			||||||
 | 
								string flag1 = null;
 | 
				
			||||||
			int[] indexes1 = null;
 | 
								int[] indexes1 = null;
 | 
				
			||||||
			var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
 | 
								var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret2 = new List<T2>();
 | 
								var ret2 = new List<T2>();
 | 
				
			||||||
			var type2 = typeof(T2);
 | 
								var type2 = typeof(T2);
 | 
				
			||||||
 | 
								string flag2 = null;
 | 
				
			||||||
			int[] indexes2 = null;
 | 
								int[] indexes2 = null;
 | 
				
			||||||
			var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
 | 
								var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret3 = new List<T3>();
 | 
								var ret3 = new List<T3>();
 | 
				
			||||||
			var type3 = typeof(T3);
 | 
								var type3 = typeof(T3);
 | 
				
			||||||
 | 
								string flag3 = null;
 | 
				
			||||||
			int[] indexes3 = null;
 | 
								int[] indexes3 = null;
 | 
				
			||||||
			var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
 | 
								var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret4 = new List<T4>();
 | 
								var ret4 = new List<T4>();
 | 
				
			||||||
			var type4 = typeof(T4);
 | 
								var type4 = typeof(T4);
 | 
				
			||||||
 | 
								string flag4 = null;
 | 
				
			||||||
			int[] indexes4 = null;
 | 
								int[] indexes4 = null;
 | 
				
			||||||
			var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties());
 | 
								var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var ret5 = new List<T5>();
 | 
								var ret5 = new List<T5>();
 | 
				
			||||||
			var type5 = typeof(T5);
 | 
								var type5 = typeof(T5);
 | 
				
			||||||
 | 
								string flag5 = null;
 | 
				
			||||||
			int[] indexes5 = null;
 | 
								int[] indexes5 = null;
 | 
				
			||||||
			var props5 = dicQueryTypeGetProperties.GetOrAdd(type5, k => type1.GetProperties());
 | 
								var props5 = dicQueryTypeGetProperties.GetOrAdd(type5, k => type1.GetProperties());
 | 
				
			||||||
			await ExecuteReaderMultipleAsync(5, connection, transaction, (dr, result) => {
 | 
								await ExecuteReaderMultipleAsync(5, connection, transaction, (dr, result) => {
 | 
				
			||||||
				switch (result) {
 | 
									switch (result) {
 | 
				
			||||||
					case 0:
 | 
										case 0:
 | 
				
			||||||
						if (indexes1 == null) {
 | 
											if (indexes1 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("QueryAsync");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag1 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value);
 | 
											ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 1:
 | 
										case 1:
 | 
				
			||||||
						if (indexes2 == null) {
 | 
											if (indexes2 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("QueryAsync");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag2 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value);
 | 
											ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 2:
 | 
										case 2:
 | 
				
			||||||
						if (indexes3 == null) {
 | 
											if (indexes3 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("QueryAsync");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag3 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(type3, indexes3, dr, 0, _util).Value);
 | 
											ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 3:
 | 
										case 3:
 | 
				
			||||||
						if (indexes4 == null) {
 | 
											if (indexes4 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("QueryAsync");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes4 = props4.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes4 = props4.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag4 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(type4, indexes4, dr, 0, _util).Value);
 | 
											ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(flag4, type4, indexes4, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 4:
 | 
										case 4:
 | 
				
			||||||
						if (indexes5 == null) {
 | 
											if (indexes5 == null) {
 | 
				
			||||||
 | 
												var sbflag = new StringBuilder().Append("QueryAsync");
 | 
				
			||||||
							var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
												var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
							for (var a = 0; a < dr.FieldCount; a++)
 | 
												for (var a = 0; a < dr.FieldCount; a++) {
 | 
				
			||||||
								dic.Add(dr.GetName(a), a);
 | 
													var name = dr.GetName(a);
 | 
				
			||||||
 | 
													sbflag.Append(name).Append(":").Append(a).Append(",");
 | 
				
			||||||
 | 
													dic.Add(name, a);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							indexes5 = props5.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
												indexes5 = props5.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
 | 
				
			||||||
 | 
												flag5 = sbflag.ToString();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						ret5.Add((T5)Utils.ExecuteArrayRowReadClassOrTuple(type5, indexes5, dr, 0, _util).Value);
 | 
											ret5.Add((T5)Utils.ExecuteArrayRowReadClassOrTuple(flag5, type5, indexes5, dr, 0, _util).Value);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				return Task.CompletedTask;
 | 
									return Task.CompletedTask;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -273,10 +273,11 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
				var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms);
 | 
									var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms);
 | 
				
			||||||
				_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
									_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
				
			||||||
				var ret = new List<TTuple>();
 | 
									var ret = new List<TTuple>();
 | 
				
			||||||
 | 
									var flagStr = $"ToListField:{field}";
 | 
				
			||||||
				Exception exception = null;
 | 
									Exception exception = null;
 | 
				
			||||||
				try {
 | 
									try {
 | 
				
			||||||
					_orm.Ado.ExecuteReader(_connection, _transaction, dr => {
 | 
										_orm.Ado.ExecuteReader(_connection, _transaction, dr => {
 | 
				
			||||||
						var read = Utils.ExecuteArrayRowReadClassOrTuple(type, null, dr, 0, _commonUtils);
 | 
											var read = Utils.ExecuteArrayRowReadClassOrTuple(flagStr, type, null, dr, 0, _commonUtils);
 | 
				
			||||||
						ret.Add((TTuple)read.Value);
 | 
											ret.Add((TTuple)read.Value);
 | 
				
			||||||
					}, CommandType.Text, sql, dbParms);
 | 
										}, CommandType.Text, sql, dbParms);
 | 
				
			||||||
				} catch (Exception ex) {
 | 
									} catch (Exception ex) {
 | 
				
			||||||
@@ -299,10 +300,11 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
				var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms);
 | 
									var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms);
 | 
				
			||||||
				_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
									_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
				
			||||||
				var ret = new List<TTuple>();
 | 
									var ret = new List<TTuple>();
 | 
				
			||||||
 | 
									var flagStr = $"ToListField:{field}";
 | 
				
			||||||
				Exception exception = null;
 | 
									Exception exception = null;
 | 
				
			||||||
				try {
 | 
									try {
 | 
				
			||||||
					await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => {
 | 
										await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => {
 | 
				
			||||||
						var read = Utils.ExecuteArrayRowReadClassOrTuple(type, null, dr, 0, _commonUtils);
 | 
											var read = Utils.ExecuteArrayRowReadClassOrTuple(flagStr, type, null, dr, 0, _commonUtils);
 | 
				
			||||||
						ret.Add((TTuple)read.Value);
 | 
											ret.Add((TTuple)read.Value);
 | 
				
			||||||
						return Task.CompletedTask;
 | 
											return Task.CompletedTask;
 | 
				
			||||||
					}, CommandType.Text, sql, dbParms);
 | 
										}, CommandType.Text, sql, dbParms);
 | 
				
			||||||
@@ -537,7 +539,7 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
					if (tbiindex == 0)
 | 
										if (tbiindex == 0)
 | 
				
			||||||
						blockExp.AddRange(new Expression[] {
 | 
											blockExp.AddRange(new Expression[] {
 | 
				
			||||||
							Expression.Assign(readExp, Expression.Call(Utils.MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(typei), Expression.Constant(null, typeof(int[])), rowExp, dataIndexExp, Expression.Constant(_commonUtils) })),
 | 
												Expression.Assign(readExp, Expression.Call(Utils.MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(null, typeof(string)), Expression.Constant(typei), Expression.Constant(null, typeof(int[])), rowExp, dataIndexExp, Expression.Constant(_commonUtils) })),
 | 
				
			||||||
							Expression.IfThen(
 | 
												Expression.IfThen(
 | 
				
			||||||
								Expression.GreaterThan(readExpDataIndex, dataIndexExp),
 | 
													Expression.GreaterThan(readExpDataIndex, dataIndexExp),
 | 
				
			||||||
								Expression.Assign(dataIndexExp, readExpDataIndex)
 | 
													Expression.Assign(dataIndexExp, readExpDataIndex)
 | 
				
			||||||
@@ -577,7 +579,7 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
							Expression.IfThenElse(
 | 
												Expression.IfThenElse(
 | 
				
			||||||
								curExpIfNotNull,
 | 
													curExpIfNotNull,
 | 
				
			||||||
								Expression.Block(new Expression[] {
 | 
													Expression.Block(new Expression[] {
 | 
				
			||||||
									Expression.Assign(readExp, Expression.Call(Utils.MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(typei), Expression.Constant(null, typeof(int[])), rowExp, dataIndexExp, Expression.Constant(_commonUtils) })),
 | 
														Expression.Assign(readExp, Expression.Call(Utils.MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(null, typeof(string)), Expression.Constant(typei), Expression.Constant(null, typeof(int[])), rowExp, dataIndexExp, Expression.Constant(_commonUtils) })),
 | 
				
			||||||
									Expression.IfThen(
 | 
														Expression.IfThen(
 | 
				
			||||||
										Expression.GreaterThan(readExpDataIndex, dataIndexExp),
 | 
															Expression.GreaterThan(readExpDataIndex, dataIndexExp),
 | 
				
			||||||
										Expression.Assign(dataIndexExp, readExpDataIndex)
 | 
															Expression.Assign(dataIndexExp, readExpDataIndex)
 | 
				
			||||||
@@ -694,7 +696,7 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
								Expression.Add(dataIndexExp, Expression.Constant(1))
 | 
													Expression.Add(dataIndexExp, Expression.Constant(1))
 | 
				
			||||||
						);
 | 
											);
 | 
				
			||||||
						else {
 | 
											else {
 | 
				
			||||||
							readExpAssign = Expression.Call(Utils.MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(prop.PropertyType), Expression.Constant(null, typeof(int[])), rowExp, dataIndexExp, Expression.Constant(_commonUtils) });
 | 
												readExpAssign = Expression.Call(Utils.MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(null, typeof(string)), Expression.Constant(prop.PropertyType), Expression.Constant(null, typeof(int[])), rowExp, dataIndexExp, Expression.Constant(_commonUtils) });
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					blockExp.AddRange(new Expression[] {
 | 
										blockExp.AddRange(new Expression[] {
 | 
				
			||||||
@@ -719,7 +721,7 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
					blockExp.Clear();
 | 
										blockExp.Clear();
 | 
				
			||||||
					blockExp.AddRange(new Expression[] {
 | 
										blockExp.AddRange(new Expression[] {
 | 
				
			||||||
						Expression.Assign(dataIndexExp, Expression.Constant(0)),
 | 
											Expression.Assign(dataIndexExp, Expression.Constant(0)),
 | 
				
			||||||
						Expression.Assign(readExp, Expression.Call(Utils.MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(type), Expression.Constant(null, typeof(int[])), rowExp, dataIndexExp, Expression.Constant(_commonUtils) })),
 | 
											Expression.Assign(readExp, Expression.Call(Utils.MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(null, typeof(string)), Expression.Constant(type), Expression.Constant(null, typeof(int[])), rowExp, dataIndexExp, Expression.Constant(_commonUtils) })),
 | 
				
			||||||
						Expression.IfThen(
 | 
											Expression.IfThen(
 | 
				
			||||||
							Expression.NotEqual(readExpValue, Expression.Constant(null)),
 | 
												Expression.NotEqual(readExpValue, Expression.Constant(null)),
 | 
				
			||||||
							Expression.Assign(retExp, Expression.Convert(readExpValue, type))
 | 
												Expression.Assign(retExp, Expression.Convert(readExpValue, type))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -703,7 +703,7 @@ namespace FreeSql.Internal {
 | 
				
			|||||||
			//[typeof(JObject)] = true,
 | 
								//[typeof(JObject)] = true,
 | 
				
			||||||
			//[typeof(JArray)] = true,
 | 
								//[typeof(JArray)] = true,
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
		internal static ConcurrentDictionary<Type, Func<Type, int[], DbDataReader, int, CommonUtils, RowInfo>> _dicExecuteArrayRowReadClassOrTuple = new ConcurrentDictionary<Type, Func<Type, int[], DbDataReader, int, CommonUtils, RowInfo>>();
 | 
							internal static ConcurrentDictionary<string, ConcurrentDictionary<Type, Func<Type, int[], DbDataReader, int, CommonUtils, RowInfo>>> _dicExecuteArrayRowReadClassOrTuple = new ConcurrentDictionary<string, ConcurrentDictionary<Type, Func<Type, int[], DbDataReader, int, CommonUtils, RowInfo>>>();
 | 
				
			||||||
		internal class RowInfo {
 | 
							internal class RowInfo {
 | 
				
			||||||
			public object Value { get; set; }
 | 
								public object Value { get; set; }
 | 
				
			||||||
			public int DataIndex { get; set; }
 | 
								public int DataIndex { get; set; }
 | 
				
			||||||
@@ -716,8 +716,11 @@ namespace FreeSql.Internal {
 | 
				
			|||||||
			public static PropertyInfo PropertyDataIndex = typeof(RowInfo).GetProperty("DataIndex");
 | 
								public static PropertyInfo PropertyDataIndex = typeof(RowInfo).GetProperty("DataIndex");
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		internal static MethodInfo MethodDataReaderGetValue = typeof(DbDataReader).GetMethod("GetValue");
 | 
							internal static MethodInfo MethodDataReaderGetValue = typeof(DbDataReader).GetMethod("GetValue");
 | 
				
			||||||
		internal static RowInfo ExecuteArrayRowReadClassOrTuple(Type typeOrg, int[] indexes, DbDataReader row, int dataIndex, CommonUtils _commonUtils) {
 | 
							internal static RowInfo ExecuteArrayRowReadClassOrTuple(string flagStr, Type typeOrg, int[] indexes, DbDataReader row, int dataIndex, CommonUtils _commonUtils) {
 | 
				
			||||||
			var func = _dicExecuteArrayRowReadClassOrTuple.GetOrAdd(typeOrg, type => {
 | 
								if (string.IsNullOrEmpty(flagStr)) flagStr = "all";
 | 
				
			||||||
 | 
								var func = _dicExecuteArrayRowReadClassOrTuple
 | 
				
			||||||
 | 
									.GetOrAdd(flagStr, flag => new ConcurrentDictionary<Type, Func<Type, int[], DbDataReader, int, CommonUtils, RowInfo>>())
 | 
				
			||||||
 | 
									.GetOrAdd(typeOrg, type => {
 | 
				
			||||||
				var returnTarget = Expression.Label(typeof(RowInfo));
 | 
									var returnTarget = Expression.Label(typeof(RowInfo));
 | 
				
			||||||
				var typeExp = Expression.Parameter(typeof(Type), "type");
 | 
									var typeExp = Expression.Parameter(typeof(Type), "type");
 | 
				
			||||||
				var indexesExp = Expression.Parameter(typeof(int[]), "indexes");
 | 
									var indexesExp = Expression.Parameter(typeof(int[]), "indexes");
 | 
				
			||||||
@@ -770,7 +773,7 @@ namespace FreeSql.Internal {
 | 
				
			|||||||
										Expression.Add(dataIndexExp, Expression.Constant(1))
 | 
															Expression.Add(dataIndexExp, Expression.Constant(1))
 | 
				
			||||||
								);
 | 
													);
 | 
				
			||||||
								else {
 | 
													else {
 | 
				
			||||||
									read2ExpAssign = Expression.Call(MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(field.FieldType), indexesExp, rowExp, dataIndexExp, commonUtilExp });
 | 
														read2ExpAssign = Expression.Call(MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(flagStr), Expression.Constant(field.FieldType), indexesExp, rowExp, dataIndexExp, commonUtilExp });
 | 
				
			||||||
								}
 | 
													}
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
							block2Exp.AddRange(new Expression[] {
 | 
												block2Exp.AddRange(new Expression[] {
 | 
				
			||||||
@@ -887,7 +890,7 @@ namespace FreeSql.Internal {
 | 
				
			|||||||
								);
 | 
													);
 | 
				
			||||||
							} else {
 | 
												} else {
 | 
				
			||||||
								readExpAssign = Expression.New(RowInfo.Constructor,
 | 
													readExpAssign = Expression.New(RowInfo.Constructor,
 | 
				
			||||||
									Expression.MakeMemberAccess(Expression.Call(MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(readType), indexesExp, rowExp, dataIndexExp, commonUtilExp }), RowInfo.PropertyValue),
 | 
														Expression.MakeMemberAccess(Expression.Call(MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(flagStr), Expression.Constant(readType), indexesExp, rowExp, dataIndexExp, commonUtilExp }), RowInfo.PropertyValue),
 | 
				
			||||||
									Expression.Add(dataIndexExp, Expression.Constant(1)));
 | 
														Expression.Add(dataIndexExp, Expression.Constant(1)));
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
@@ -984,7 +987,7 @@ namespace FreeSql.Internal {
 | 
				
			|||||||
							} else {
 | 
												} else {
 | 
				
			||||||
								++propIndex;
 | 
													++propIndex;
 | 
				
			||||||
								continue;
 | 
													continue;
 | 
				
			||||||
								//readExpAssign = Expression.Call(MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(readType), indexesExp, rowExp, tryidxExp });
 | 
													//readExpAssign = Expression.Call(MethodExecuteArrayRowReadClassOrTuple, new Expression[] { Expression.Constant(flagStr), Expression.Constant(readType), indexesExp, rowExp, tryidxExp });
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user