How to Convert a LINQ result to DATATABLE?

前端 未结 2 2079
情歌与酒
情歌与酒 2020-12-18 13:02

Is there any way to convert the result of a LINQ expression to a DataTable without stepping through each element?

相关标签:
2条回答
  • 2020-12-18 13:21

    Nope there is no way to create it without stepping through each element. The Linq expression is evaluated when needed so it will step through each row (for matching and selection).

    I think you should try using DataTable.Select() (MSDN link) method instead as it returns array of DataRow objects that you can add to new table as follows:

    var rows = [ORIGINAL DATA TABLE].Select("id>5");
    
    var dtb=[ORIGINAL DATA TABLE].Clone();
    
    foreach(DataRow r in rows)
    {
        var newRow = dtb.NewRow();
        newRow.ItemArray = r.ItemArray;
        dtb.Rows.Add(newRow);//I'm doubtful if you need to call this or not
    }
    
    0 讨论(0)
  • 2020-12-18 13:43

    Credit to this blogger, but I've improved on his algorithm here. Make yourself an extension method:

        public static DataTable ToADOTable<T>(this IEnumerable<T> varlist)
        {
            DataTable dtReturn = new DataTable();
            // Use reflection to get property names, to create table
            // column names
            PropertyInfo[] oProps = typeof(T).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));
            }
            foreach (T rec in varlist)
            {
                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);
        }
    

    Usage:

    DataTable dt = query.ToADOTable();
    
    0 讨论(0)
提交回复
热议问题