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(); } } }
/// <summary> /// Executes the actual select. /// </summary> /// <returns>An enumeration of the actual select.</returns> private IEnumerable <T> Execute() { IEnumerable <T> source = this._Source; if (_WhereFirst != null) { source = this._WhereFirst.FilterPass <T>(source); } if (_OrderFirst != null) { source = this._OrderFirst.Sort <T>(source); } if (_PageSize > 0 && _PageOrdinal >= 0) { source = new Collections.EnumerablePager <T>(source, _PageSize, _PageOrdinal); } return(source); }
public IEnumerable <object> SelectMember(DataAspect aspect, int ordinal, ClassFilter filter, ClassSort sort, int pageSize, int pageOrdinal) { using (IDbConnection conn = _dialect.CreateConnection(_ConnectionString)) { conn.Open(); try { IEnumerable <IDataRecord> records = _dialect.CreateSelectMember(aspect, ordinal, 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); } } foreach (IDataRecord record in records) { yield return(record.GetValue(0)); } } finally { conn.Close(); } } }