コード例 #1
0
        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();
                }
            }
        }