public IEnumerable <T> Select <T>(DataAspect aspect, ClassFilter filter, ClassSort sort, int pageSize, int pageOrdinal) { using (IDbConnection conn = _dialect.CreateConnection(_ConnectionString)) { conn.Open(); try { IEnumerable <IDataRecord> records = _dialect.CreateSelect(aspect, filter, sort, pageSize, pageOrdinal).ExecuteQuery(conn); if (pageSize > 0 && pageOrdinal >= 0) { if (!_dialect.CanOffsetRecords) { if (!_dialect.CanLimitRecords) { records = new Collections.EnumerablePager <IDataRecord>(records, pageSize, pageOrdinal); } else { records = new Collections.EnumerableOffset <IDataRecord>(records, pageSize * pageOrdinal); } } else if (!_dialect.CanLimitRecords) { records = new Collections.EnumerableLimit <IDataRecord>(records, pageSize); } } using (IEnumerator <IDataRecord> e = records.GetEnumerator()) { if (e.MoveNext()) { bool initializable = typeof(Initializable).IsAssignableFrom(aspect.DataType); int count = e.Current.FieldCount; do { T entity = (T)aspect.NewInstance(); for (int i = 0; i < count; i++) { if (!e.Current.IsDBNull(i)) { aspect[i].SetValue(entity, e.Current.GetValue(i)); } } if (initializable) { ((Initializable)entity).Initialize(); } yield return(entity); } while (e.MoveNext()); } } } finally { conn.Close(); } } }