/// <summary>
        /// Reader转成List《T》
        /// </summary>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="dr"></param>
        /// <param name="isClose"></param>
        /// <returns></returns>
        internal static List <T> DataReaderToList <T>(Type type, IDataReader dr, string fields, bool isClose = true, bool isTry = true)
        {
            if (type.Name.Contains("KeyValuePair"))
            {
                List <T> strReval = new List <T>();
                FillValueTypeToDictionary(type, dr, strReval);
                return(strReval);
            }
            //值类型
            else if (type.GetTypeInfo().IsValueType || type == SqlSugarTool.StringType)
            {
                List <T> strReval = new List <T>();
                FillValueTypeToDr <T>(type, dr, strReval);
                return(strReval);
            }
            //数组类型
            else if (type.IsArray)
            {
                List <T> strReval = new List <T>();
                FillValueTypeToArray(type, dr, strReval);
                return(strReval);
            }


            var cacheManager = CacheManager <IDataReaderEntityBuilder <T> > .GetInstance();

            string key = "DataReaderToList." + fields + type.FullName;
            IDataReaderEntityBuilder <T> eblist = null;

            if (cacheManager.ContainsKey(key))
            {
                eblist = cacheManager[key];
            }
            else
            {
                eblist = IDataReaderEntityBuilder <T> .CreateBuilder(type, dr);

                cacheManager.Add(key, eblist, cacheManager.Day);
            }
            List <T> list = new List <T>();

            try
            {
                if (dr == null)
                {
                    return(list);
                }
                while (dr.Read())
                {
                    list.Add(eblist.Build(dr));
                }
                if (isClose)
                {
                    dr.Close(); dr.Dispose(); dr = null;
                }
            }
            catch (Exception ex)
            {
                if (isTry)//解决实体变更缓存引起的错误
                {
                    try
                    {
                        if (cacheManager.ContainsKey(key))
                        {
                            //清除实体缓存
                            cacheManager.Remove(key);
                            return(DataReaderToList <T>(type, dr, fields, isClose, false));
                        }
                    }
                    catch (Exception innerEx)
                    {
                        throw new Exception("可能实体与数据库类型不匹配,请用 var str = db.ClassGenerating.TableNameToClass(db, \"类名\") 查看正确的实体!!\r\n具体错误信息:" + innerEx.Message);
                    }
                    finally {
                        if (isClose)
                        {
                            dr.Close(); dr.Dispose(); dr = null;
                        }
                    }
                }
                else
                {
                    if (isClose)
                    {
                        dr.Close(); dr.Dispose(); dr = null;
                    }
                    throw ex;
                }
            }
            return(list);
        }
Пример #2
0
        /// <summary>
        ///  Reader转成T的集合
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="type"></param>
        /// <param name="dr"></param>
        /// <param name="fields"></param>
        /// <param name="isClose"></param>
        /// <param name="isTry"></param>
        /// <returns></returns>
        internal static List <T> DataReaderToList <T>(Type type, IDataReader dr, string fields, bool isClose = true, bool isTry = true)
        {
            if (type.Name.Contains("KeyValuePair"))
            {
                List <T> strReval = new List <T>();
                FillValueTypeToDictionary(type, dr, strReval);
                return(strReval);
            }
            //值类型
            else if (type.IsValueType || type == SqlSugarTool.StringType)
            {
                List <T> strReval = new List <T>();
                FillValueTypeToDr <T>(type, dr, strReval);
                return(strReval);
            }
            //数组类型
            else if (type.IsArray)
            {
                List <T> strReval = new List <T>();
                FillValueTypeToArray(type, dr, strReval);
                return(strReval);
            }


            var cacheManager = CacheManager <IDataReaderEntityBuilder <T> > .GetInstance();

            string key = "DataReaderToList." + fields + type.FullName;
            IDataReaderEntityBuilder <T> eblist = null;

            if (cacheManager.ContainsKey(key))
            {
                eblist = cacheManager[key];
            }
            else
            {
                eblist = IDataReaderEntityBuilder <T> .CreateBuilder(type, dr);

                cacheManager.Add(key, eblist, cacheManager.Day);
            }
            List <T> list = new List <T>();

            try
            {
                if (dr == null)
                {
                    return(list);
                }
                while (dr.Read())
                {
                    list.Add(eblist.Build(dr));
                }
                if (isClose)
                {
                    dr.Close(); dr.Dispose(); dr = null;
                }
            }
            catch (Exception ex)
            {
                if (isClose)
                {
                    dr.Close(); dr.Dispose(); dr = null;
                }
                Check.Exception(true, "错误信息:实体映射出错。\r\n错误详情:{0}", ex.Message);
            }
            return(list);
        }
Пример #3
0
        /// <summary>
        ///  Reader转成T的集合
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="type"></param>
        /// <param name="dr"></param>
        /// <param name="fields"></param>
        /// <param name="isClose"></param>
        /// <param name="isTry"></param>
        /// <returns></returns>
        internal static IEnumerable <T> DataReaderToList <T>(Type type, IDataReader dr, string fields, bool isClose = true, bool isTry = true)
        {
            if (type.Name.Contains("KeyValuePair"))
            {
                foreach (var model in FillValueTypeToDictionary <T>(type, dr))
                {
                    yield return(model);
                }
                yield break;
            }
            //值类型
            else if (type.IsValueType || type == SqlSugarTool.StringType)
            {
                foreach (var model in FillValueTypeToDr <T>(type, dr))
                {
                    yield return(model);
                }
                yield break;
            }
            //数组类型
            else if (type.IsArray)
            {
                foreach (var model in FillValueTypeToArray <T>(type, dr))
                {
                    yield return(model);
                }
                yield break;
            }


            var cacheManager = CacheManager <IDataReaderEntityBuilder <T> > .GetInstance();

            string key = "DataReaderToList." + fields + type.FullName;
            IDataReaderEntityBuilder <T> eblist = null;

            if (cacheManager.ContainsKey(key))
            {
                eblist = cacheManager[key];
            }
            else
            {
                eblist = IDataReaderEntityBuilder <T> .CreateBuilder(type, dr);

                cacheManager.Add(key, eblist, cacheManager.Day);
            }

            try
            {
                if (dr == null)
                {
                    yield return(default(T));
                }
                while (dr.Read())
                {
                    yield return(eblist.Build(dr));
                }
            }
            finally
            {
                if (isClose)
                {
                    dr.Close(); dr.Dispose(); dr = null;
                }
            }
        }