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); }
/// <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); }