Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert DataTable to IEnumerable<T>

I am trying to convert a DataTable to an IEnumerable. Where T is a custom type I created. I know I can do it by creating a List<T> but I was thinking if there is a slicker way to do it using IEnumerable. Here is what I have now:

private IEnumerable<TankReading> ConvertToTankReadings(DataTable dataTable) {     var tankReadings = new List<TankReading>();     foreach (DataRow row in dataTable.Rows)     {         var tankReading =                new TankReading               {                   TankReadingsID = Convert.ToInt32(row["TRReadingsID"]),                   TankID = Convert.ToInt32(row["TankID"]),                   ReadingDateTime = Convert.ToDateTime(row["ReadingDateTime"]),                   ReadingFeet = Convert.ToInt32(row["ReadingFeet"]),                   ReadingInches = Convert.ToInt32(row["ReadingInches"]),                   MaterialNumber = row["MaterialNumber"].ToString(),                   EnteredBy = row["EnteredBy"].ToString(),                   ReadingPounds = Convert.ToDecimal(row["ReadingPounds"]),                   MaterialID = Convert.ToInt32(row["MaterialID"]),                   Submitted = Convert.ToBoolean(row["Submitted"]),               };          tankReadings.Add(tankReading);     }     return tankReadings.AsEnumerable(); } 

The key part being I am creating a List<T> then returning it using AsEnumerable().

like image 482
mpenrow Avatar asked Aug 02 '10 23:08

mpenrow


1 Answers

There's also a DataSetExtension method called "AsEnumerable()" (in System.Data) that takes a DataTable and returns an Enumerable. See the MSDN doc for more details, but it's basically as easy as:

dataTable.AsEnumerable() 

The downside is that it's enumerating DataRow, not your custom class. A "Select()" LINQ call could convert the row data, however:

private IEnumerable<TankReading> ConvertToTankReadings(DataTable dataTable) {     return dataTable.AsEnumerable().Select(row => new TankReading                   {                       TankReadingsID = Convert.ToInt32(row["TRReadingsID"]),                       TankID = Convert.ToInt32(row["TankID"]),                       ReadingDateTime = Convert.ToDateTime(row["ReadingDateTime"]),                       ReadingFeet = Convert.ToInt32(row["ReadingFeet"]),                       ReadingInches = Convert.ToInt32(row["ReadingInches"]),                       MaterialNumber = row["MaterialNumber"].ToString(),                       EnteredBy = row["EnteredBy"].ToString(),                       ReadingPounds = Convert.ToDecimal(row["ReadingPounds"]),                       MaterialID = Convert.ToInt32(row["MaterialID"]),                       Submitted = Convert.ToBoolean(row["Submitted"]),                   }); } 
like image 51
JaredReisinger Avatar answered Oct 05 '22 10:10

JaredReisinger