示例#1
0
 /// <summary>
 /// Sets each <seealso cref="PropertyInfo"/> of the <paramref name="dbObject"/> to the value of
 /// the <paramref name="record"/>, so long as the <seealso cref="PropertyInfo"/> is not the
 /// primary key of the <paramref name="dbObject"/>.
 /// </summary>
 /// <typeparam name="T">Type of <seealso cref="DBObject"/></typeparam>
 /// <param name="dbObject"><seealso cref="DBObject"/> to set <seealso cref="PropertyInfo"/> values for.</param>
 /// <param name="record"><seealso cref="DbDataRecord"/> to read values from.</param>
 private static void SetPropertyValuesFromRecord <T>(ref T dbObject, DbDataRecord record) where T : DBObject
 {
     for (int i = 0; i < record.FieldCount; i++)
     {
         if (record.GetName(i) != dbObject.PrimaryKeyPropertyInfo.Name)
         {
             dbObject.GetType().GetProperty(record.GetName(i)).SetValue(dbObject, record.GetValue(i));
         }
     }
 }
示例#2
0
        /// <summary>Audit entity deleted.</summary>
        /// <param name="entry">The entry.</param>
        /// <param name="record">The record.</param>
        /// <param name="prefix">The prefix.</param>
        public static void AuditEntityDeleted(AuditEntry entry, ObjectStateEntry objectStateEntry, DbDataRecord record, string prefix = "")
        {
            for (var i = 0; i < record.FieldCount; i++)
            {
                var name  = record.GetName(i);
                var value = record.GetValue(i);

                if (entry.Parent.Configuration.UseNullForDBNullValue && value == DBNull.Value)
                {
                    value = null;
                }

                var valueRecord = value as DbDataRecord;
                if (valueRecord != null)
                {
                    // Complex Type
                    AuditEntityDeleted(entry, objectStateEntry, valueRecord, string.Concat(prefix, name, "."));
                }
                else if (objectStateEntry.EntityKey.EntityKeyValues.Any(x => x.Key == name) || entry.Parent.CurrentOrDefaultConfiguration.IsAuditedProperty(entry.Entry, string.Concat(prefix, name)))
                {
                    var auditEntryProperty = entry.Parent.Configuration.AuditEntryPropertyFactory != null?
                                             entry.Parent.Configuration.AuditEntryPropertyFactory(new AuditEntryPropertyArgs(entry, objectStateEntry, string.Concat(prefix, name), value, null)) :
                                                 new AuditEntryProperty();

                    auditEntryProperty.IsKey = objectStateEntry.EntitySet.ElementType.KeyMembers.Any(x => x.Name == name);

                    auditEntryProperty.Build(entry, string.Concat(prefix, name), value, null);
                    entry.Properties.Add(auditEntryProperty);
                }
            }
        }
        /// <summary>Audit entity modified.</summary>
        /// <param name="audit">The audit to use to add changes made to the context.</param>
        /// <param name="entry">The entry.</param>
        /// <param name="objectStateEntry">The object state entry.</param>
        /// <param name="orginalRecord">The orginal record.</param>
        /// <param name="currentRecord">The current record.</param>
        /// <param name="prefix">The prefix.</param>
        public static void AuditEntityModified(Audit audit, AuditEntry entry, ObjectStateEntry objectStateEntry, DbDataRecord orginalRecord, DbUpdatableDataRecord currentRecord, string prefix = "")
        {
            for (var i = 0; i < orginalRecord.FieldCount; i++)
            {
                var name          = orginalRecord.GetName(i);
                var originalValue = orginalRecord.GetValue(i);
                var currentValue  = currentRecord.GetValue(i);

                var valueRecord = originalValue as DbDataRecord;
                if (valueRecord != null)
                {
                    // Complex Type
                    AuditEntityModified(audit, entry, objectStateEntry, valueRecord, currentValue as DbUpdatableDataRecord, string.Concat(prefix, name, "."));
                }

                else if (objectStateEntry.EntityKey.EntityKeyValues.Any(x => x.Key == name) ||
                         entry.Parent.CurrentOrDefaultConfiguration.IsAuditedProperty(entry.Entry, name))
                {
                    if (!audit.Configuration.IgnorePropertyUnchanged ||
                        objectStateEntry.EntityKey.EntityKeyValues.Any(x => x.Key == name) ||
                        !Equals(currentValue, originalValue))
                    {
                        var auditEntryProperty = entry.Parent.Configuration.AuditEntryPropertyFactory != null?
                                                 entry.Parent.Configuration.AuditEntryPropertyFactory(new AuditEntryPropertyArgs(entry, objectStateEntry, string.Concat(prefix, name), originalValue, currentValue)) :
                                                     new AuditEntryProperty();

                        auditEntryProperty.Build(entry, string.Concat(prefix, name), originalValue, currentValue);
                        entry.Properties.Add(auditEntryProperty);
                    }
                }
            }
        }
 private static IEnumerable <string> GetColumnNames(DbDataRecord record)
 {
     // Get all of the column names for this query
     for (int i = 0; i < record.FieldCount; i++)
     {
         yield return(record.GetName(i));
     }
 }
示例#5
0
        static void TestProduct(string esqlQuery, Dictionary <string, object> parametes)
        {
            using (EntityConnection conn =
                       new EntityConnection("name=AdventureWorksEntities"))
            {
                conn.Open();

                try
                {
                    // Create an EntityCommand.
                    using (EntityCommand cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = esqlQuery;
                        foreach (KeyValuePair <string, object> kvp in parametes)
                        {
                            cmd.Parameters.AddWithValue(kvp.Key, kvp.Value);
                        }

                        // Execute the command.
                        using (EntityDataReader rdr =
                                   cmd.ExecuteReader(CommandBehavior.SequentialAccess))
                        {
                            // The result returned by this query contains
                            // Address complex Types.
                            while (rdr.Read())
                            {
                                int col = rdr.FieldCount;
                                if (rdr.FieldCount > 3)
                                {
                                    col = 3;
                                }
                                for (int i = 0; i < col; i++)
                                {
                                    Console.Write("{0}   ", rdr[i]);
                                }
                                Console.WriteLine();
                                if (rdr.Depth > 0)
                                {
                                    // Display Address information.
                                    DbDataRecord nestedRecord =
                                        rdr[0] as DbDataRecord;
                                    for (int i = 0; i < nestedRecord.FieldCount; i++)
                                    {
                                        Console.WriteLine("  " + nestedRecord.GetName(i) +
                                                          ": " + nestedRecord.GetValue(i));
                                    }
                                }
                            }
                        }
                    }
                }
                catch (EntityException ex)
                {
                    Console.WriteLine(ex.ToString());
                }
                conn.Close();
            }
        }
示例#6
0
 /// <summary>
 /// Sets the primary key of a <seealso cref="DBObject"/> using the specified <paramref name="record"/>.
 /// </summary>
 /// <param name="record"><seealso cref="DbDataRecord"/> to get the primary key from.</param>
 internal void SetPrimaryKey(DbDataRecord record)
 {
     for (int i = 0; i < record.FieldCount; i++)
     {
         if (record.GetName(i) == PrimaryKeyPropertyInfo.Name)
         {
             SetPrimaryKey((int)record.GetValue(i));
         }
     }
 }
示例#7
0
        static private void ComplexTypeWithEntityCommand()
        {
            //<snippetComplexTypeWithEntityCommand>
            using (EntityConnection conn =
                       new EntityConnection("name=CustomerComplexAddrContext"))
            {
                conn.Open();

                // Create a query that returns Address complex type.
                string esqlQuery =
                    @"SELECT VALUE customers FROM
                        CustomerComplexAddrContext.CCustomers
                        AS customers WHERE customers.CustomerId < 3";
                try
                {
                    // Create an EntityCommand.
                    using (EntityCommand cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = esqlQuery;
                        // Execute the command.
                        using (EntityDataReader rdr =
                                   cmd.ExecuteReader(CommandBehavior.SequentialAccess))
                        {
                            // The result returned by this query contains
                            // Address complex Types.
                            while (rdr.Read())
                            {
                                // Display CustomerID
                                Console.WriteLine("Customer ID: {0}",
                                                  rdr["CustomerId"]);
                                // Display Address information.
                                DbDataRecord nestedRecord =
                                    rdr["Address"] as DbDataRecord;
                                Console.WriteLine("Address:");
                                for (int i = 0; i < nestedRecord.FieldCount; i++)
                                {
                                    Console.WriteLine("  " + nestedRecord.GetName(i) +
                                                      ": " + nestedRecord.GetValue(i));
                                }
                            }
                        }
                    }
                }
                catch (EntityException ex)
                {
                    Console.WriteLine(ex.ToString());
                }
                conn.Close();
            }
            //</snippetComplexTypeWithEntityCommand>
        }
        /// <summary>
        ///   Converts a single DbDataRecord object into something else.
        ///   The destination type must have a default constructor.
        /// </summary>
        /// <typeparam name = "T"></typeparam>
        /// <param name = "record"></param>
        /// <returns></returns>
        public static T ConvertTo <T>(this DbDataRecord record) where T : new()
        {
            var item = new T();

            for (int f = 0; f < record.FieldCount; f++)
            {
                var p = item.GetType().GetProperty(record.GetName(f));
                if (p != null && p.PropertyType == record.GetFieldType(f))
                {
                    p.SetValue(item, record.GetValue(f), null);
                }
            }

            return(item);
        }
示例#9
0
文件: source.cs 项目: winxxp/samples
        static public void ComplexTypeWithEntityCommand()
        {
            //<snippetComplexTypeWithEntityCommand>
            using (EntityConnection conn =
                       new EntityConnection("name=AdventureWorksEntities"))
            {
                conn.Open();

                string esqlQuery = @"SELECT VALUE contacts FROM
                        AdventureWorksEntities.Contacts AS contacts 
                        WHERE contacts.ContactID == @id";

                // Create an EntityCommand.
                using (EntityCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = esqlQuery;
                    EntityParameter param = new EntityParameter();
                    param.ParameterName = "id";
                    param.Value         = 3;
                    cmd.Parameters.Add(param);

                    // Execute the command.
                    using (EntityDataReader rdr =
                               cmd.ExecuteReader(CommandBehavior.SequentialAccess))
                    {
                        // The result returned by this query contains
                        // Address complex Types.
                        while (rdr.Read())
                        {
                            // Display CustomerID
                            Console.WriteLine("Contact ID: {0}",
                                              rdr["ContactID"]);
                            // Display Address information.
                            DbDataRecord nestedRecord =
                                rdr["EmailPhoneComplexProperty"] as DbDataRecord;
                            Console.WriteLine("Email and Phone Info:");
                            for (int i = 0; i < nestedRecord.FieldCount; i++)
                            {
                                Console.WriteLine("  " + nestedRecord.GetName(i) +
                                                  ": " + nestedRecord.GetValue(i));
                            }
                        }
                    }
                }
                conn.Close();
            }
            //</snippetComplexTypeWithEntityCommand>
        }
 private void DrawComplexType(TreeNode node, DbDataRecord originalValues, DbDataRecord currentValues)
 {
     for (int i = 0; i < originalValues.FieldCount; i++)
     {
         TreeNode childNode = new TreeNode(CreateNodeText(originalValues.GetName(i), false));
         node.Nodes.Add(childNode);
         if (_entry.OriginalValues[i] is DbDataRecord)
         {
             DrawComplexType(childNode, originalValues[i] as DbDataRecord, currentValues[i] as DbDataRecord);
         }
         else
         {
             DrawProperty(childNode, originalValues[i], currentValues[i]);
         }
     }
 }
示例#11
0
        /// <summary>Audit entity deleted.</summary>
        /// <param name="entry">The entry.</param>
        /// <param name="record">The record.</param>
        /// <param name="prefix">The prefix.</param>
        public static void AuditEntityDeleted(AuditEntry entry, DbDataRecord record, string prefix = "")
        {
            for (var i = 0; i < record.FieldCount; i++)
            {
                var name  = record.GetName(i);
                var value = record.GetValue(i);

                var valueRecord = value as DbDataRecord;
                if (valueRecord != null)
                {
                    // Complex Type
                    AuditEntityDeleted(entry, valueRecord, string.Concat(prefix, name, "."));
                }
                else if (entry.Parent.CurrentOrDefaultConfiguration.IsAuditedProperty(entry.Entry, name))
                {
                    entry.Properties.Add(new AuditEntryProperty(entry, string.Concat(prefix, name), value, null));
                }
            }
        }
示例#12
0
        internal IEnumerator <T> ExecuteReader <T>(string sql)
        {
            Type            TypeT = typeof(T);
            ConstructorInfo ctor  = TypeT.GetConstructor(Type.EmptyTypes);

            if (ctor == null)
            {
                throw new InvalidOperationException($"Type {TypeT.Name} does not have a default constructor.");
            }
            _sqlConnection.Open();

            IEnumerator data = new SqlCommand(sql, _sqlConnection).ExecuteReader().GetEnumerator();

            while (data.MoveNext())
            {
                T            newInst    = (T)ctor.Invoke(null);
                DbDataRecord record     = (DbDataRecord)data.Current;
                int          fieldCount = Properties.GetFieldCount((DbDataRecord)data.Current);

                for (int i = 0; i < fieldCount; i++)
                {
                    string       propertyName = record.GetName(i);
                    PropertyInfo propertyInfo = TypeT.GetProperty(propertyName);
                    if (propertyInfo != null)
                    {
                        object value = record[i];
                        if (value == DBNull.Value)
                        {
                            propertyInfo.SetValue(newInst, null);
                        }
                        else
                        {
                            propertyInfo.SetValue(newInst, value);
                        }
                    }
                }
                yield return(newInst);
            }
        }
        public static void AuditEntityModified(Audit audit, AuditEntry entry, DbDataRecord orginalRecord, DbUpdatableDataRecord currentRecord, string prefix = "")
        {
            for (var i = 0; i < orginalRecord.FieldCount; i++)
            {
                var name          = orginalRecord.GetName(i);
                var originalValue = orginalRecord.GetValue(i);
                var currentValue  = currentRecord.GetValue(i);

                var valueRecord = originalValue as DbDataRecord;
                if (valueRecord != null)
                {
                    // Complex Type
                    AuditEntityModified(audit, entry, valueRecord, currentValue as DbUpdatableDataRecord, string.Concat(prefix, name, "."));
                }
                else
                {
                    if (audit.Configuration.IncludePropertyUnchanged || !Equals(currentValue, originalValue))
                    {
                        entry.Properties.Add(new AuditEntryProperty(string.Concat(prefix, name), originalValue, currentValue));
                    }
                }
            }
        }
示例#14
0
        /// <summary>
        ///     Map used to specify the type for more dynamic code.
        /// </summary>
        /// <param name="idr">DbDataRecord from DbDataReader</param>
        /// <param name="type">Type of the object to be returned</param>
        /// <returns>Returns instance of the specified type populated from the database.</returns>
        internal static object Map(DbDataRecord idr, Type type)
        {
            object result = Activator.CreateInstance(type);

            if (result == null)
            {
                throw new Exception(@"Unable to materialize the specified type.");
            }

            string[] columNames = new string[idr.FieldCount];

            for (int col = 0; col < idr.FieldCount; col++)
            {
                if (idr.IsDBNull(col))
                {
                    continue;                    /* Only map the columns that have values */
                }
                columNames[col] = idr.GetName(col).ToLower();
            }

            /* Use the extender to get the relevant properties */
            ConcurrentBag <PropertyMap> mappings = new(result.GetMappings(columNames));

            if (mappings.Count <= 0)
            {
                return(null);
            }


            foreach (PropertyMap pm in mappings)
            {
                PropertyInfo pi  = pm.Key;
                Column       col = pm.Value;

                string name     = string.Equals(col.Name, pi.Name, StringComparison.CurrentCultureIgnoreCase) ? pi.Name : col.Name;
                Type   nullable = Nullable.GetUnderlyingType(pi.PropertyType);

                if (idr[name] == DBNull.Value)
                {
                    continue;
                }

                object value = idr[name];

                if (nullable != null)
                {
                    if (col.DataType == typeof(char?))
                    {
                        if (ReferenceEquals(value, ""))
                        {
                            continue;
                        }
                    }

                    pi.SetValue(result, Convert.ChangeType(value, nullable), null);
                    continue; /* Step to the next property */
                }

                if (pi.PropertyType.IsEnum)
                {
                    pi.SetValue(result, Enum.ToObject(pi.PropertyType, value));
                    continue;
                }

                pi.SetValue(result, Convert.ChangeType(value, pi.PropertyType));
            }

            return(result);
        }
示例#15
0
        public static StringCollection GetEnumerationItemFiledNames(object item, string fieldToExclude)
        {
            StringCollection stringCollection = new StringCollection();

            if (item is DataRow)
            {
                foreach (DataColumn column in ((DataRow)item).Table.Columns)
                {
                    if (column.ColumnName != fieldToExclude)
                    {
                        stringCollection.Add(column.ColumnName);
                    }
                }
                return(stringCollection);
            }
            if (item is DataRowView)
            {
                foreach (DataColumn column2 in ((DataRowView)item).DataView.Table.Columns)
                {
                    if (column2.ColumnName != fieldToExclude)
                    {
                        stringCollection.Add(column2.ColumnName);
                    }
                }
                return(stringCollection);
            }
            if (item is DbDataRecord)
            {
                DbDataRecord dbDataRecord = (DbDataRecord)item;
                for (int i = 0; i < dbDataRecord.FieldCount; i++)
                {
                    string name = dbDataRecord.GetName(i);
                    if (name != fieldToExclude)
                    {
                        stringCollection.Add(name);
                    }
                }
            }
            else if (item != null)
            {
                PropertyInfo[] properties = item.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
                if (properties != null)
                {
                    PropertyInfo[] array = properties;
                    foreach (PropertyInfo propertyInfo in array)
                    {
                        if (propertyInfo.Name != fieldToExclude)
                        {
                            stringCollection.Add(propertyInfo.Name);
                        }
                    }
                }
                FieldInfo[] fields = item.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public);
                if (fields != null)
                {
                    FieldInfo[] array2 = fields;
                    foreach (FieldInfo fieldInfo in array2)
                    {
                        if (fieldInfo.Name != fieldToExclude)
                        {
                            stringCollection.Add(fieldInfo.Name);
                        }
                    }
                }
            }
            return(stringCollection);
        }
示例#16
0
            public void Write(object o)
            {
                if (o == null)
                {
                    Write("null");
                }
                else if (o is DateTime)
                {
                    Write("{");
                    Write(((DateTime)o).ToShortDateString());
                    Write("}");
                }
                else if (o is ValueType)
                {
                    Write(o.ToString());
                }
                else if (o is Type)
                {
                    Write(((Type)o).Name);
                }
                else if (o is Exception)
                {
                    Write("EXCEPTION: " + o.ToString());
                }
                else if (o is byte[])
                {
                    byte[] arr    = (byte[])o;
                    int    length = Math.Min(arr.Length, 32);
                    string t      = "Byte[" + arr.Length + "] = " + BitConverter.ToString(arr, 0, length) + ((length != arr.Length) ? "..." : "");
                    Write(t);
                }
                else if (o is string)
                {
                    Write("\"");
                    Write(o as string);
                    Write("\"");
                }
                else
                {
                    if (o is ObjectCollectionCache)
                    {
                        Write(((ObjectCollectionCache)o).OriginalType);
                    }
                    else
                    {
                        Write(o.GetType());
                    }
                    Write(" ");

                    if (ancestors.Contains(o) || (Level > depth + 1))
                    {
                        Write("{...}");
                    }
                    else
                    {
                        ancestors.Push(o);
                        if (o is IEnumerable)
                        {
                            var members = from object element in (o as IEnumerable)
                                          select new Member {
                                Name = null, Value = element
                            };

                            Write(members);
                        }
                        else if (o is DbDataRecord)
                        {
                            DbDataRecord rec = o as DbDataRecord;

                            var members = from element in Enumerable.Range(0, rec.FieldCount)
                                          select new Member {
                                Name = rec.GetName(element), Value = rec.IsDBNull(element) ? null : rec.GetValue(element)
                            };

                            Write(members);
                        }
                        else
                        {
                            var members = from element in o.GetType().GetMembers(BindingFlags.Public | BindingFlags.Instance)
                                          let p                 = element as PropertyInfo
                                                          let f = element as FieldInfo
                                                                  where p != null || f != null && !element.Name.StartsWith("_")
                                                                  select new Member {
                                Name = element.Name, Value = p != null?p.GetValue(o, null) : f.GetValue(o)
                            };

                            Write(members);
                        }
                    }
                }
            }
        public void Write(object o)
        {
            if (o == null)
            {
                Write("null");
            }
            else if (o == _omittedValue)
            {
                Write("{...}");
            }
            else if (o is DateTime)
            {
                Write("{");
                Write(((DateTime)o).ToString());
                Write("}");
            }
            else if (o is ValueType)
            {
                Write(o.ToString());
            }
            else if (o is Type)
            {
                Write(((Type)o).Name);
            }
            else if (o is Exception)
            {
                Write("EXCEPTION: " + o.ToString());
            }
            else if (o is byte[])
            {
                byte[] arr    = (byte[])o;
                int    length = Math.Min(arr.Length, 32);
                string t      = "Byte[" + arr.Length + "] = " + BitConverter.ToString(arr, 0, length) + ((length != arr.Length) ? "..." : "");
                Write(t);
            }
            else if (o is string)
            {
                Write("\"");
                Write(o as string);
                Write("\"");
            }
            else
            {
                if (o is ObjectCollectionCache)
                {
                    Write(((ObjectCollectionCache)o).OriginalType);
                }
                else
                {
                    Write(o.GetType());
                }
                Write(" ");

                if (_ancestors.Contains(o) || (Level > _maximumDepth + 1))
                {
                    Write("{...}");
                }
                else
                {
                    _ancestors.Push(o);
                    if (o is IEnumerable)
                    {
                        var members = from object element in (o as IEnumerable)
                                      select new Member {
                            Name = null, Value = element
                        };

                        Write(members);
                    }
                    else if (o is DbDataRecord)
                    {
                        DbDataRecord rec = o as DbDataRecord;

                        var members = from element in Enumerable.Range(0, rec.FieldCount)
                                      select new Member {
                            Name = rec.GetName(element), Value = rec.IsDBNull(element) ? null : rec.GetValue(element)
                        };

                        Write(members);
                    }
                    else
                    {
                        var members = from element in o.GetType().GetMembers(BindingFlags.Public | BindingFlags.Instance)
                                      let p                 = element as PropertyInfo
                                                      let f = element as FieldInfo
                                                              where p != null || f != null
                                                              select new Member {
                            Name = element.Name, Value = p != null?p.GetValue(o, null) : f.GetValue(o)
                        };

                        // remove members which cause explosion of the tree
                        if (o is EntityReference)
                        {
                            members = members.Select(c => new Member {
                                Name = c.Name, Value = (c.Name == "RelationshipSet" ? _omittedValue : c.Value)
                            });
                        }

                        Write(members);
                    }
                }
            }
        }
示例#18
0
        public TreeNode GetTreeNode(object o)
        {
            if (o == null)
            {
                return(GetNullNode());
            }

            if (o is Exception)
            {
                return(GetExceptionNode((Exception)o));
            }

            if (o is DateTime)
            {
                return(GetDateTimeNode((DateTime)o));
            }

            if (o is String)
            {
                return(GetStringNode((string)o));
            }

            if (o is Type)
            {
                return(GetTypeNode((Type)o));
            }

            if (o is byte[])
            {
                return(GetByteArrayNode((byte[])o));
            }

            if (o is ValueType)
            {
                return(GetValueTypeNode(o));
            }

            if (_ancestors.Contains(o) || _level >= _maxLoadDepth)
            {
                return(new TreeNode("{ ... }"));
            }

            TreeNode parentNode = new TreeNode(GetNiceTypeName(o.GetType()));

            if (o is ObjectCollectionCache)
            {
                parentNode.Text = GetNiceTypeName(((ObjectCollectionCache)o).OriginalType);
            }

            _ancestors.Push(o);
            int oldLevel = _level;

            _level++;

            if (o is IEnumerable)
            {
                parentNode.SelectedImageIndex = parentNode.ImageIndex = 4;
                var members = (from object element in (o as IEnumerable)
                               select new Member {
                    Name = null, Value = element
                }).ToList();

                AttachChildren(parentNode, members);;
                parentNode.Text += " (" + members.Count + " item" + (members.Count != 1 ? "s" : "") + ")";
            }
            else if (o is DbDataRecord)
            {
                parentNode.SelectedImageIndex = parentNode.ImageIndex = 2;
                DbDataRecord rec = o as DbDataRecord;

                var members = from element in Enumerable.Range(0, rec.FieldCount)
                              select new Member {
                    Name = rec.GetName(element), Value = rec.IsDBNull(element) ? null : rec.GetValue(element)
                };

                AttachChildren(parentNode, members);;
            }
            else
            {
                parentNode.SelectedImageIndex = parentNode.ImageIndex = 1;

                var members = from element in o.GetType().GetMembers(BindingFlags.Public | BindingFlags.Instance)
                              let p                 = element as PropertyInfo
                                              let f = element as FieldInfo
                                                      where p != null || f != null && !element.Name.StartsWith("_")
                                                      select new Member {
                    Name = element.Name, Value = p != null?p.GetValue(o, null) : f.GetValue(o)
                };

                AttachChildren(parentNode, members);;

                IEntityWithKey ewk = o as IEntityWithKey;
                if (ewk != null)
                {
                    StringBuilder sb = new StringBuilder(parentNode.Text.Length + 20);
                    sb.Append(parentNode.Text);
                    sb.Append("(");

                    for (int i = 0; i < ewk.EntityKey.EntityKeyValues.Length; ++i)
                    {
                        if (i > 0)
                        {
                            sb.Append(", ");
                        }
                        sb.Append(ewk.EntityKey.EntityKeyValues[i].Key);
                        sb.Append("=");
                        sb.Append(ewk.EntityKey.EntityKeyValues[i].Value);
                    }
                    sb.Append(")");
                    parentNode.Text = sb.ToString();
                }
            }
            if (_level <= _expandDepth)
            {
                parentNode.Expand();
            }
            _ancestors.Pop();
            _level = oldLevel;

            return(parentNode);
        }
        public TreeNode GetTreeNode(object o)
        {
            if (o == null)
            {
                return(GetNullNode());
            }

            if (o == _omittedValue)
            {
                return(new TreeNode("{ ... }"));
            }

            if (o is Exception)
            {
                return(GetExceptionNode((Exception)o));
            }

            if (o is DateTime)
            {
                return(GetDateTimeNode((DateTime)o));
            }

            if (o is String)
            {
                return(GetStringNode((string)o));
            }

            if (o is Type)
            {
                return(GetTypeNode((Type)o));
            }

            if (o is byte[])
            {
                return(GetByteArrayNode((byte[])o));
            }

            if (o is ValueType)
            {
                return(GetValueTypeNode(o));
            }

            if (_ancestors.Contains(o) || _level >= _maxLoadDepth)
            {
                return(new TreeNode("{ ... }"));
            }

            TreeNode parentNode = new TreeNode(GetNiceTypeName(o.GetType()));

            if (o is ObjectCollectionCache)
            {
                parentNode.Text = GetNiceTypeName(((ObjectCollectionCache)o).OriginalType);
            }

            _ancestors.Push(o);
            int oldLevel = _level;

            _level++;

            if (o is IEnumerable)
            {
                parentNode.SelectedImageIndex = parentNode.ImageIndex = 4;
                var members = (from object element in (o as IEnumerable)
                               select new Member {
                    Name = null, Value = element
                }).ToList();

                AttachChildren(parentNode, members);;
                parentNode.Text += " (" + members.Count + " item" + (members.Count != 1 ? "s" : "") + ")";
            }
            else if (o is DbDataRecord)
            {
                parentNode.SelectedImageIndex = parentNode.ImageIndex = 2;
                DbDataRecord rec = o as DbDataRecord;

                var members = from element in Enumerable.Range(0, rec.FieldCount)
                              select new Member {
                    Name = rec.GetName(element), Value = rec.IsDBNull(element) ? null : rec.GetValue(element)
                };

                AttachChildren(parentNode, members);;
            }
            else
            {
                parentNode.SelectedImageIndex = parentNode.ImageIndex = 1;

                var members = from element in o.GetType().GetMembers(BindingFlags.Public | BindingFlags.Instance)
                              let p                 = element as PropertyInfo
                                              let f = element as FieldInfo
                                                      where p != null || f != null
                                                      select new Member {
                    Name = element.Name, Value = p != null?p.GetValue(o, null) : f.GetValue(o)
                };

                // replace members who would lead to tree explosion with _omittedValue
                // which emits { ... }

                if (o is EntityReference)
                {
                    members = members.Select(c => new Member {
                        Name = c.Name, Value = (c.Name == "RelationshipSet" ? _omittedValue : c.Value)
                    });
                }

                AttachChildren(parentNode, members);;

                IEntityWithKey ewk = o as IEntityWithKey;
                if (ewk != null)
                {
                    parentNode.Text += " { " + GetEntityKeyText(ewk.EntityKey) + " }";
                }
            }
            if (_level <= _expandDepth)
            {
                parentNode.Expand();
            }
            _ancestors.Pop();
            _level = oldLevel;

            return(parentNode);
        }