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)


Comments (0)