2010-08-18 136 views

回答

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 
} 
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 2010-10-23 16:48:17

+0

@Phil - 除非您發佈完整的錯誤文本,其中應包含對兩種競爭方法的引用,否則無法分辨。然後你會知道哪個其他方法具有相同的簽名。 – 2010-10-24 15:04:05

+0

就是這樣......這對他們來說都是相同的簽名。真奇怪!無論如何,這是簽名,瑞典語中的一些名字。如果你直接不知道,我只會發表一個關於它的問題。錯誤消息:CS0121:以下方法或屬性之間的調用不明確:'Gruppkoll.App_Code.ConvertToDataTableFromLinqResult.ToADOTable (System.Collections.Generic.IEnumerable )'和'Gruppkoll.App_Code。 ConvertToDataTableFromLinqResult.ToADOTable (System.Collections.Generic.IEnumerable )' – Phil 2010-10-25 08:45:54