public static DataTable DeriveSchemaTable(FeatureDataTable table,
                                                  ColumnLengthComputationDelegate lengthComputationDelegate,
                                                  ColumnPrecisionComputationDelegate precisionComputationDelegate,
                                                  ColumnScaleComputationDelegate scaleComputationDelegate)
        {
            DataTable schema = CreateSchemaTable();

            foreach (DataColumn column in table.Columns)
            {
                DataColumn[] keyColumns = table.PrimaryKey ?? new DataColumn[] { };

                Int32 length = column.ExtendedProperties.ContainsKey(LengthExtendedProperty)
                    ? Convert.ToInt32(column.ExtendedProperties[LengthExtendedProperty])
                    : (lengthComputationDelegate == null) ? 0 : lengthComputationDelegate(column);

                Int16 precision = column.ExtendedProperties.ContainsKey(NumericPrecisionExtendedProperty)
                    ? Convert.ToInt16(column.ExtendedProperties[NumericPrecisionExtendedProperty])
                    : (precisionComputationDelegate == null) ? (Int16)0 : precisionComputationDelegate(column);

                Int16 scale = column.ExtendedProperties.ContainsKey(NumericScaleExtendedProperty)
                    ? Convert.ToInt16(column.ExtendedProperties[NumericScaleExtendedProperty])
                    : (scaleComputationDelegate == null) ? (Int16)0 : scaleComputationDelegate(column);

                schema.Rows.Add(
                    column.ColumnName,
                    length,
                    column.Ordinal,
                    precision,
                    scale,
                    column.DataType,
                    column.AllowDBNull,
                    column.ReadOnly,
                    column.Unique,
                    Array.Exists(keyColumns, delegate(DataColumn col) { return(col == column); }),
                    column.AutoIncrement,
                    false);
            }

            return(schema);
        }
        public static DataTable DeriveSchemaTable(FeatureDataTable table,
            ColumnLengthComputationDelegate lengthComputationDelegate,
            ColumnPrecisionComputationDelegate precisionComputationDelegate,
            ColumnScaleComputationDelegate scaleComputationDelegate)
        {
            DataTable schema = CreateSchemaTable();
            foreach (DataColumn column in table.Columns)
            {
                DataColumn[] keyColumns = table.PrimaryKey ?? new DataColumn[] { };

                int length = column.ExtendedProperties.ContainsKey(LengthExtendedProperty)
                    ? Convert.ToInt32(column.ExtendedProperties[LengthExtendedProperty])
                    : (lengthComputationDelegate == null) ? 0 : lengthComputationDelegate(column);

                short precision = column.ExtendedProperties.ContainsKey(NumericPrecisionExtendedProperty)
                    ? Convert.ToInt16(column.ExtendedProperties[NumericPrecisionExtendedProperty])
                    : (precisionComputationDelegate == null) ? (short)0 : precisionComputationDelegate(column);

                short scale = column.ExtendedProperties.ContainsKey(NumericScaleExtendedProperty)
                    ? Convert.ToInt16(column.ExtendedProperties[NumericScaleExtendedProperty])
                    : (scaleComputationDelegate == null) ? (short)0 : scaleComputationDelegate(column);

#if !CFBuild
                schema.Rows.Add(
                    column.ColumnName,
                    length,
                    column.Ordinal,
                    precision,
                    scale,
                    column.DataType,
                    column.AllowDBNull,
                    column.ReadOnly,
                    column.Unique,
                    Array.Exists(keyColumns, delegate(DataColumn col) { return col == column; }),
                    column.AutoIncrement,
                    false);
#else //The Predicate is a delegate to a method that returns true if the object passed to it
                //matches the conditions defined in the delegate. The elements of array are individually 
                //passed to the Predicate, and processing is stopped when a match is found.
                bool isKey = false;
                foreach (DataColumn col in keyColumns)
                {
                    if (col == column)
                    {
                        isKey = true;
                        break;
                    }
                }

                schema.Rows.Add(
                    column.ColumnName,
                    length,
                    column.Ordinal,
                    precision,
                    scale,
                    column.DataType,
                    column.AllowDBNull,
                    column.ReadOnly,
                    column.Unique,
                    isKey,
                    column.AutoIncrement,
                    false);
#endif
            }

            return schema;
        }
        public static DataTable DeriveSchemaTable(FeatureDataTable table,
            ColumnLengthComputationDelegate lengthComputationDelegate,
            ColumnPrecisionComputationDelegate precisionComputationDelegate,
            ColumnScaleComputationDelegate scaleComputationDelegate)
        {
            DataTable schema = CreateSchemaTable();
            foreach (DataColumn column in table.Columns)
            {
                DataColumn[] keyColumns = table.PrimaryKey ?? new DataColumn[] { };

                Int32 length = column.ExtendedProperties.ContainsKey(LengthExtendedProperty)
                    ? Convert.ToInt32(column.ExtendedProperties[LengthExtendedProperty])
                    : (lengthComputationDelegate == null) ? 0 : lengthComputationDelegate(column);

                Int16 precision = column.ExtendedProperties.ContainsKey(NumericPrecisionExtendedProperty)
                    ? Convert.ToInt16(column.ExtendedProperties[NumericPrecisionExtendedProperty])
                    : (precisionComputationDelegate == null) ? (Int16)0 : precisionComputationDelegate(column);

                Int16 scale = column.ExtendedProperties.ContainsKey(NumericScaleExtendedProperty)
                    ? Convert.ToInt16(column.ExtendedProperties[NumericScaleExtendedProperty])
                    : (scaleComputationDelegate == null) ? (Int16)0 : scaleComputationDelegate(column);

                schema.Rows.Add(
                    column.ColumnName,
                    length,
                    column.Ordinal,
                    precision,
                    scale,
                    column.DataType,
                    column.AllowDBNull,
                    column.ReadOnly,
                    column.Unique,
                    Array.Exists(keyColumns, delegate(DataColumn col) { return col == column; }),
                    column.AutoIncrement,
                    false);
            }

            return schema;
        }