Share via


Getting metadata about dataset using lambda. Some examples.

This may not be a massive business requirement, but if you have a bunch of DataSets and you want (for some reason) extract information about them

then using Lambda and LINQ queries is one way to do it. I will let the code below speak for itself.

Sample code for meta data collection for DataSet:

    class Program

    {

        static void Main(string[] args)

        {

            // Create a demo dataset

            DataSet ourDataSet = CreateDataSet();

            // Display the DataTable info

            ShowTableCollectionInfo(ourDataSet.Tables);

        }

        private static void ShowTableCollectionInfo(DataTableCollection dtc)

        {

            IEnumerable<DataTable> tbls = dtc.Cast<DataTable>();

            int tblCount = dtc.Count;

            StringBuilder sb = new StringBuilder();

            // Which table(s) has the most rows?

            int maxRows = tbls.Max(x => x.Rows.Count);

            var maxRowsTableQuery = tbls.Where((x, max) => x.Rows.Count == maxRows);

            sb.AppendFormat("Table(s) with highest # of rows ({0}):", maxRows, tblCount);

            foreach (DataTable tbl in maxRowsTableQuery)

            {

                sb.AppendFormat("\n\t{0}", tbl.TableName);

            }

            // How many rows are there in total, i.e. sum of rows in all datatables?

            int totalRows = tbls.Sum(x => x.Rows.Count);

            sb.AppendFormat("\n\nTotal # of rows: {0} (in {1} tables)", totalRows, tblCount);

            // How many column on average.

            double columnAve = tbls.Average(x => x.Columns.Count);

            sb.AppendFormat("\n\nAverage # of cols: {0} (in {1} tables)", columnAve.ToString(), tblCount);

            //etc.

          

            // Show results

            Console.WriteLine(sb.ToString());

        }

        private static DataSet CreateDataSet()

        {

            DataTable dt_1 = new DataTable("DataTable_One");

            dt_1.Columns.Add(new DataColumn("T1_C1", typeof(int)));

            dt_1.Columns.Add(new DataColumn("T1_C2", typeof(int)));

            dt_1.Columns.Add(new DataColumn("T1_C3", typeof(int)));

            DataTable dt_2 = new DataTable("DataTable_Two");

            dt_2.Columns.Add(new DataColumn("T2_C1", typeof(int)));

            dt_2.Columns.Add(new DataColumn("T2_C2", typeof(int)));

            DataTable dt_3 = new DataTable("DataTable_Three");

            dt_3.Columns.Add(new DataColumn("T3_C1", typeof(int)));

            DataTable dt_4 = new DataTable("DataTable_Four");

            dt_4.Columns.Add(new DataColumn("T4_C1", typeof(int)));

            dt_4.Columns.Add(new DataColumn("T4_C2", typeof(int)));

            dt_4.Columns.Add(new DataColumn("T4_C3", typeof(int)));

            DataSet ds = new DataSet("OurDataSet");

            ds.Tables.Add(dt_1);

            ds.Tables.Add(dt_2);

            ds.Tables.Add(dt_3);

            ds.Tables.Add(dt_4);

            for (int i = 0; i < 10; i++)

            {

                dt_1.Rows.Add(new object[] { i, i + 5, i + 10 });

            }

            for (int i = 0; i < 5; i++)

            {

                dt_2.Rows.Add(new object[] { i, i * 5 });

            }

            for (int i = 0; i < 15; i++)

            {

                dt_3.Rows.Add(new object[] { i * 10 });

            }

            for (int i = 0; i < 5; i++)

            {

                dt_4.Rows.Add(new object[] { i, i + 100, i + 50 });

            }

            return ds;

        }

    }

Running this should output the following:

Table(s) with highest # of rows (15):

        DataTable_Three

Total # of rows: 35 (in 4 tables)

Average # of cols: 2,25 (in 4 tables)