2011-07-22 27 views
3

這個工程:飼料LINQ導致成一個DataRow

var Result = from e in actual.Elements 
         select new 
         { 
          Key = e.Key, 
          ValueNumber = e.Value.ValueNumber, 
          ValueString = e.Value.ValueString, 
          ValueBinary = e.Value.ValueBinary, 
          ValueDateTime = e.Value.ValueDateTime 
         }; 

但是,這並不工作:

IEnumerable<DataRow> Result = from e in actual.Elements 
       select new DataRow 
       { 
        Key = e.Key, 
        ValueNumber = e.Value.ValueNumber, 
        ValueString = e.Value.ValueString, 
        ValueBinary = e.Value.ValueBinary, 
        ValueDateTime = e.Value.ValueDateTime 
       }; 

DataTable dt = Result.CopyToDataTable(Result); 

你能解決一下嗎?我希望第二部分代碼能夠工作,以便我可以將它放入DataTable中。我意識到#2中的語法是完全錯誤的。你如何指定使用LINQ這樣的列?

+0

什麼是actual.Elements一個DataColumn?另一個DataTable? – Tim

+0

元素是一本字典。 「關鍵」部分是一個字符串。 「值」部分是一個具有4個屬性的類 - ValueNumber,ValueString,ValueBinary,ValueDateTime ... – 010110110101

回答

3

您可以編寫接受任何IEnumerable<T>一個簡單的擴展方法,使用反射來獲取和T相關的PropertyDescriptor S,併爲每個

public static DataTable PropertiesToDataTable(this IEnumerable<T> source) 
{ 
     DataTable dt = new DataTable(); 

     var props = TypeDescriptor.GetProperties(typeof(T)); 

     foreach (PropertyDescriptor prop in props) 
     { 
      DataColumn dc = dt.Columns.Add(prop.Name,prop.PropertyType); 
      dc.Caption = prop.DisplayName; 
      dc.ReadOnly = prop.IsReadOnly; 
     } 

     foreach (T item in source) 
     { 
      DataRow dr = dt.Rows.NewRow(); 
      foreach (PropertyDescriptor prop in props) 
       dr[prop.Name] = prop.GetValue(item); 

      dt.Rows.Add(dr); 
     } 

     return dt;  
} 
0

你可能要考慮的DataTableExtensions.AsEnumerable Method

我沒有測試過這一點,但是這可能會你指出正確的方向:

IEnumerable<DataRow> result = (from e in actual.Elements 
           select new DataRow 
           { 
            Key = e.Key, 
            ValueNumber = e.Value.ValueNumber, 
            ValueString = e.Value.ValueString, 
            ValueBinary = e.Value.ValueBinary, 
            ValueDateTime = e.Value.ValueDateTime 
           }).AsEnumerable(); 

DataTable dt = Result.CopyToDataTable(Result); 
+0

不,它不工作。拋出編譯錯誤DataRow由於保護級別而無法訪問。如何解決這個問題? –