2010-08-18 2 views

ответ

2

Нет способа создать его без stepping через каждый элемент. Выражение 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 
} 
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(); 
+0

Я получаю эту ошибку при использовании кода: «CS0121: Вызов неоднозначен между следующими методами или свойствами: <а затем класс, содержащим ваш метод> «Вы знаете, как это решить? Спасибо за код, хотя, +1 – Phil

+0

@Phil - не могу сказать, если вы не публикуете полный текст ошибки, который должен содержать ссылку на оба конкурирующих метода. Затем вы узнаете, какой другой метод имеет одну и ту же подпись. –

+0

Вот и все .. это для них одинаковая подпись. Действительно странно! Во всяком случае, вот подпись, некоторые имена на шведском языке. Если вы не знаете напрямую, я просто отправлю вопрос об этом. Сообщение об ошибке: CS0121: вызов неоднозначен между следующими методами или свойствами: «Gruppkoll.App_Code.ConvertToDataTableFromLinqResult.ToADOTable (System.Collections.Generic.IEnumerable ) 'и' Gruppkoll.App_Code. ConvertToDataTableFromLinqResult.ToADOTable (System.Collections.Generic.IEnumerable ) ' – Phil

Смежные вопросы