天天看点

IEnumerable<T> 转换 DataTable

Sample I:

I created a public method called LINQToDataTable as following:

public DataTable LINQToDataTable<T>(IEnumerable<T> varlist)

{

     DataTable dtReturn = new DataTable();

     // column names 

     PropertyInfo[] oProps = null;

     if (varlist == null) return dtReturn;

     foreach (T rec in varlist)

     {

          // Use reflection to get property names, to create table, Only first time, others 

          will follow 

          if (oProps == null)

          {

               oProps = ((Type)rec.GetType()).GetProperties();

               foreach (PropertyInfo pi in oProps)

               {

                    Type colType = pi.PropertyType;

                    if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()      

                    ==typeof(Nullable<>)))

                     {

                         colType = colType.GetGenericArguments()[0];

                     }

                    dtReturn.Columns.Add(new DataColumn(pi.Name, colType));

               }

          }

          DataRow dr = dtReturn.NewRow();

          foreach (PropertyInfo pi in oProps)

          {

               dr[pi.Name] = pi.GetValue(rec, null) == null ?DBNull.Value :pi.GetValue

               (rec,null);

          }

          dtReturn.Rows.Add(dr);

     }

     return dtReturn;

}

---------------------------------------------------------------

Example: To use this method, just use the following code sample:

var vrCountry = from country in objEmpDataContext.CountryMaster

                        select new {country.CountryID,country.CountryName};

DataTable dt = LINQToDataTable(vrCountry);

Sample II

Here is my second method:

public DataTable ToDataTable(System.Data.Linq.DataContext ctx, object query)

     if (query == null)

          throw new ArgumentNullException("query");

     IDbCommand cmd = ctx.GetCommand(query as IQueryable);

     SqlDataAdapter adapter = new SqlDataAdapter();

     adapter.SelectCommand = (SqlCommand)cmd;

     DataTable dt = new DataTable("sd");

     try

          cmd.Connection.Open();

          adapter.FillSchema(dt, SchemaType.Source); 

          adapter.Fill(dt);

     finally

          cmd.Connection.Close();

     return dt;

DataTable dt = LINQToDataTable(objEmpDataContext,vrCountry);