using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; namespace SqlSugar { public partial class DbBindAccessory { protected List GetEntityList(SqlSugarClient context, IDataReader dataReader) { var type = typeof(T); var fieldNames = GetDataReaderNames(dataReader); var cacheKey = GetCacheKey(type, fieldNames); var entytyList = context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(cacheKey, () => { var cacheResult = new IDataReaderEntityBuilder(context, dataReader, fieldNames).CreateBuilder(type); return cacheResult; }); var result = new List(); try { if (dataReader == null) return result; while (dataReader.Read()) { result.Add(entytyList.Build(dataReader)); } } catch (Exception ex) { Check.Exception(true, ErrorMessage.EntityMappingError, ex.Message); } return result; } private string GetCacheKey(Type type, List keys) { var sb = new StringBuilder("DataReaderToList."); sb.Append(type.FullName); sb.Append("."); foreach (var item in keys) { sb.Append(item); } return sb.ToString(); } private List GetDataReaderNames(IDataReader dataReader) { var keys = new List(); var count = dataReader.FieldCount; for (int i = 0; i < count; i++) { keys.Add(dataReader.GetName(i)); } return keys; } protected List GetKeyValueList(Type type, IDataReader dataReader) { var result = new List(); while (dataReader.Read()) { if (UtilConstants.DicOO == type) { var kv = new KeyValuePair(dataReader.GetValue(0), dataReader.GetValue(1)); result.Add((T)Convert.ChangeType(kv, typeof(KeyValuePair))); } else if (UtilConstants.DicIS == type) { var kv = new KeyValuePair(dataReader.GetValue(0).ObjToInt(), dataReader.GetValue(1).ObjToString()); result.Add((T)Convert.ChangeType(kv, typeof(KeyValuePair))); } else if (UtilConstants.Dicii == type) { var kv = new KeyValuePair(dataReader.GetValue(0).ObjToInt(), dataReader.GetValue(1).ObjToInt()); result.Add((T)Convert.ChangeType(kv, typeof(KeyValuePair))); } else if (UtilConstants.DicSi == type) { var kv = new KeyValuePair(dataReader.GetValue(0).ObjToString(), dataReader.GetValue(1).ObjToInt()); result.Add((T)Convert.ChangeType(kv, typeof(KeyValuePair))); } else if (UtilConstants.DicSo == type) { var kv = new KeyValuePair(dataReader.GetValue(0).ObjToString(), dataReader.GetValue(1)); result.Add((T)Convert.ChangeType(kv, typeof(KeyValuePair))); } else if (UtilConstants.DicSS == type) { var kv = new KeyValuePair(dataReader.GetValue(0).ObjToString(), dataReader.GetValue(1).ObjToString()); result.Add((T)Convert.ChangeType(kv, typeof(KeyValuePair))); } else { Check.Exception(true, ErrorMessage.NotSupportedDictionary); } } return result; } protected List GetArrayList(Type type, IDataReader dataReader) { var result = new List(); var count = dataReader.FieldCount; var childType = type.GetElementType(); while (dataReader.Read()) { var array = new object[count]; for (int i = 0; i < count; i++) { array[i] = Convert.ChangeType(dataReader.GetValue(i), childType); } if (childType == UtilConstants.StringType) result.Add((T)Convert.ChangeType(array.Select(it => it.ObjToString()).ToArray(), type)); else if (childType == UtilConstants.ObjType) result.Add((T)Convert.ChangeType(array.Select(it => it == DBNull.Value ? null : (object)it).ToArray(), type)); else if (childType == UtilConstants.BoolType) result.Add((T)Convert.ChangeType(array.Select(it => it.ObjToBool()).ToArray(), type)); else if (childType == UtilConstants.ByteType) result.Add((T)Convert.ChangeType(array.Select(it => it == DBNull.Value ? 0 : (byte)it).ToArray(), type)); else if (childType == UtilConstants.DecType) result.Add((T)Convert.ChangeType(array.Select(it => it.ObjToDecimal()).ToArray(), type)); else if (childType == UtilConstants.GuidType) result.Add((T)Convert.ChangeType(array.Select(it => it == DBNull.Value ? Guid.Empty : (Guid)it).ToArray(), type)); else if (childType == UtilConstants.DateType) result.Add((T)Convert.ChangeType(array.Select(it => it == DBNull.Value ? DateTime.MinValue : (DateTime)it).ToArray(), type)); else if (childType == UtilConstants.IntType) result.Add((T)Convert.ChangeType(array.Select(it => it.ObjToInt()).ToArray(), type)); else Check.Exception(true, ErrorMessage.NotSupportedArray); } return result; } protected List GetValueTypeList(Type type, IDataReader dataReader) { var result = new List(); while (dataReader.Read()) { var value = dataReader.GetValue(0); if (type == UtilConstants.GuidType) { value = Guid.Parse(value.ToString()); } if (value == DBNull.Value) { result.Add(default(T)); } else if (type.IsEnum) { result.Add((T)Enum.Parse(type, value.ObjToString())); } else { result.Add((T)Convert.ChangeType(value, UtilMethods.GetUnderType(type))); } } return result; } } }