예제 #1
0
        public static List <T> QueryList <T>(IDataReader reader) where T : class, new()
        {
            List <T> list = new List <T>();

            using (reader)
            {
                if (reader.Read())
                {
                    int fcount = reader.FieldCount;
                    INamedMemberAccessor[]            accessors = new INamedMemberAccessor[fcount];
                    DelegatedReflectionMemberAccessor drm       = new DelegatedReflectionMemberAccessor();
                    for (int i = 0; i < fcount; i++)
                    {
                        accessors[i] = drm.FindAccessor <T>(reader.GetName(i));
                    }

                    do
                    {
                        T t = new T();
                        for (int i = 0; i < fcount; i++)
                        {
                            if (!reader.IsDBNull(i))
                            {
                                accessors[i].SetValue(t, reader.GetValue(i));
                            }
                        }
                        list.Add(t);
                    } while (reader.Read());
                }
            }
            return(list);
        }
예제 #2
0
        /// <summary>
        /// 采用快速的方法,将数据阅读器的结果映射到一个POCO类的列表上
        /// </summary>
        /// <typeparam name="T">POCO类类型</typeparam>
        /// <param name="reader">抽象数据阅读器</param>
        /// <returns>POCO类的列表</returns>
        public static List <T> QueryList <T>(IDataReader reader) where T : class, new()
        {
            List <T> list = new List <T>();

            using (reader)
            {
                if (reader.Read())
                {
                    int fcount = reader.FieldCount;
                    //使用类型化委托读取正确的数据,解决MySQL等数据库可能的问题,感谢网友 @卖女孩的小肥羊 发现此问题
                    Dictionary <Type, MyFunc <IDataReader, int, object> > readerDelegates = DataReaderDelegate();
                    MyFunc <IDataReader, int, object>[] getDataMethods = new MyFunc <IDataReader, int, object> [fcount];

                    INamedMemberAccessor[]            accessors      = new INamedMemberAccessor[fcount];
                    DelegatedReflectionMemberAccessor accessorMethod = new DelegatedReflectionMemberAccessor();
                    for (int i = 0; i < fcount; i++)
                    {
                        accessors[i] = accessorMethod.FindAccessor <T>(reader.GetName(i));
                        //修改成从POCO实体类的属性上来获取DataReader类型化数据访问的方法,而不是之前的DataReader 的字段的类型
                        if (!readerDelegates.TryGetValue(accessors[i].MemberType, out getDataMethods[i]))
                        {
                            getDataMethods[i] = (rd, ii) => rd.GetValue(ii);
                        }
                    }

                    do
                    {
                        T t = new T();
                        for (int i = 0; i < fcount; i++)
                        {
                            if (!reader.IsDBNull(i))
                            {
                                MyFunc <IDataReader, int, object> read = getDataMethods[i];
                                object value = read(reader, i);
                                accessors[i].SetValue(t, value);
                            }
                        }
                        list.Add(t);
                    } while (reader.Read());
                }
            }
            return(list);
        }