Как преобразовать результат LINQ в DATATABLE? - PullRequest
3 голосов
/ 18 августа 2010

Есть ли способ преобразовать результат выражения LINQ в DataTable, не проходя через каждый элемент?

Ответы [ 2 ]

5 голосов
/ 22 сентября 2010

Кредит этому блоггеру , но я улучшил его алгоритм здесь. Сделай себе метод расширения:

    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();
2 голосов
/ 18 августа 2010

Нет, нет способа создать его без прохождения через каждый элемент.Выражение 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...