public static void EntityListByEmit(System.Data.IDataReader DataReader, DbExecuteReadOnebyOneAction <T> callback) { Dictionary <string, string> FieldDic = new Dictionary <string, string>(); int i = 0; while (i < DataReader.FieldCount) { string Name = DataReader.GetName(i); if (!FieldDic.ContainsKey(Name.ToLower())) { FieldDic.Add(Name.ToLower(), Name); } i++; } EntityPropertyEmitSetter[] ps = EntityPropertyEmitSetter.GetProperties(typeof(T)); long rowNum = 0; while (DataReader.Read()) { T obj = new T(); int num = 0; while (num < ps.Length) { string fieldName = ps[num].Info.Name; string name = fieldName.ToLower(); object val = DataReader[FieldDic[name]]; if (FieldDic.ContainsKey(name) && val != DBNull.Value) { ps[num].Setter(obj, val); } num++; } rowNum++; DbExecuteReadOnebyOneResult <T> result = new DbExecuteReadOnebyOneResult <T>(rowNum, obj); try { callback(result); } catch { break; } if (!result.Next) { break; } } DataReader.Close(); }
/// <summary> /// 获取一个类中的所有公开实例属性和它们的Set方法委托 /// </summary> public static EntityPropertyEmitSetter[] GetProperties(Type type) { EntityPropertyEmitSetter[] arr; if (Cache.TryGetValue(type, out arr)) { return(arr); } PropertyInfo[] ps = type.GetProperties(); arr = new EntityPropertyEmitSetter[ps.Length]; Type delegateType = typeof(ZeroEntityPropertyEmitSetter); for (int i = 0; i < ps.Length; i++) { EntityPropertyEmitSetter op = new EntityPropertyEmitSetter(); op.Info = ps[i]; op.Setter = CreateSetter(op.Info, delegateType); arr[i] = op; } Cache.Add(type, arr); return(arr); }
public static List <T> EntityListByEmit(System.Data.IDataReader DataReader) { Dictionary <string, string> FieldDic = new Dictionary <string, string>(); int i = 0; while (i < DataReader.FieldCount) { string Name = DataReader.GetName(i); if (!FieldDic.ContainsKey(Name.ToLower())) { FieldDic.Add(Name.ToLower(), Name); } i++; } List <T> Li = new List <T>(); EntityPropertyEmitSetter[] ps = EntityPropertyEmitSetter.GetProperties(typeof(T)); while (DataReader.Read()) { T obj = new T(); int num = 0; while (num < ps.Length) { string fieldName = ps[num].Info.Name; string name = fieldName.ToLower(); object val = DataReader[FieldDic[name]]; if (FieldDic.ContainsKey(name) && val != DBNull.Value) { ps[num].Setter(obj, val); } num++; } Li.Add(obj); } DataReader.Close(); return(Li); }