如何将LINQ结果转换为DATATABLE?

时间:2010-08-18 05:48:40

标签: c# linq datatable

有没有办法在不逐步浏览每个元素的情况下将LINQ表达式的结果转换为DataTable

2 个答案:

答案 0 :(得分:5)

归功于this blogger,但我在这里改进了他的算法。让自己成为一种扩展方法:

    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);
    }

用法:

DataTable dt = query.ToADOTable();

答案 1 :(得分:2)

如果没有踩踏通过每个元素,就没有办法创建它。 Linq表达式在需要时进行评估,因此它将遍历每一行(用于匹配和选择)。

我认为您应该尝试使用DataTable.Select()MSDN link)方法,因为它会返回您可以添加到新表中的DataRow个对象数组,如下所示:

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
}