void InternalDeserializer(Dictionary <string, object> upContext, Dictionary <int, object> pkContext, DbDataReader reader, DynDeserializerItem o)
            {
                Dictionary <string, object> values;

                foreach (KeyValuePair <string, int> kv in o.Fields)
                {
                    upContext[kv.Key] = reader.GetValue(kv.Value);
                }

                List <object> list = new List <object>(); object a;

                foreach (KeyValuePair <string, DynDeserializerItem> kv in o.Collections)
                {
                    if (kv.Value.Index != -1)
                    {
                        if (reader.IsDBNull(kv.Value.Index))
                        {
                            if (!upContext.ContainsKey(kv.Key))
                            {
                                upContext.Add(kv.Key, (dynamic)null);
                            }
                            continue;
                        }

                        object pk = reader.GetValue(kv.Value.Index);
                        if (pkContext.ContainsKey(kv.Value.Index))
                        {
                            if ((pkContext[kv.Value.Index] as IComparable).CompareTo(pk) > 0)
                            {
                                if (!upContext.ContainsKey(kv.Key))
                                {
                                    upContext.Add(kv.Key, (dynamic)null);
                                }
                                continue;
                            }
                        }

                        pkContext[kv.Value.Index] = pk;
                    }

                    values = new Dictionary <string, object>(StringComparer.InvariantCultureIgnoreCase);
                    if (kv.Value.Single)
                    {
                        upContext.Add(kv.Key, (dynamic)DynObj.Create(values));
                    }
                    else
                    {
                        upContext.TryGetValue(kv.Key, out a);
                        if (null == (list = a as List <object>))
                        {
                            list = new List <object>();
                            upContext[kv.Key] = list;
                        }

                        list.Add((dynamic)DynObj.Create(values));
                    }

                    InternalDeserializer(values, pkContext, reader, kv.Value);
                }
            }
            public T Deserializer <T>(DbDataReader reader, out bool more) where T : class
            {
                more = false;
                Dictionary <int, object> _pkContext = new Dictionary <int, object>();

                object index_value_1 = reader.GetValue(_dynObjItem.Index);
                object index_value_2;

                Dictionary <string, object> values = new Dictionary <string, object>(StringComparer.InvariantCultureIgnoreCase);

                do
                {
                    InternalDeserializer(values, _pkContext, reader, _dynObjItem);

                    if (reader.Read())
                    {
                        index_value_2 = reader.GetValue(_dynObjItem.Index);
                        if ((index_value_2 as IComparable).CompareTo(index_value_1) != 0)
                        {
                            more = true;
                            break;
                        }
                    }
                    else
                    {
                        break;
                    }
                } while (true);

                return(DynObj.Create(values) as T);
            }