2014-10-31 143 views

回答

1

我已經包含了一個擴展方法,我使用SqlBulkCopy來完成這個工作,但是我想問你爲什麼要這個轉換。數量有限的情況下(SqlBulkCopy是一個),其中一個對象列表不能做一切數據表可以。您可以將它們用作大多數控件的綁定源......只是好奇。

public static DataTable toDataTable<T>(this IEnumerable<T> value, List<string> exclusionList) 
     where T : class 
    { 
     var dataTable = new DataTable(); 

     var type = typeof(T); 

     var properties = type.GetProperties().Where(x => !exclusionList.Contains(x.Name)).ToList(); 

     foreach (var propertyInfo in properties) 
     { 
      var propertyType = propertyInfo.PropertyType; 
      if (!propertyType.IsScalar()) 
       continue; 

      var nullableType = Nullable.GetUnderlyingType(propertyType); 
      propertyType = nullableType ?? propertyType; 

      var dataColumn = new DataColumn(propertyInfo.Name, propertyType); 

      if (nullableType != null) 
       dataColumn.AllowDBNull = true; 

      dataTable.Columns.Add(dataColumn); 
     } 

     foreach (var row in value) 
     { 
      var dataRow = dataTable.NewRow(); 

      foreach (var property in properties) 
      { 
       var safeValue = property.GetValue(row, null) ?? DBNull.Value;      
       dataRow[property.Name] = safeValue; 
      } 

      dataTable.Rows.Add(dataRow); 
     } 

     return dataTable; 
    } 
+0

讓我們假設你有一個圖書館一類檢索使用LINQ從數據庫中的信息,您想要返回不同類型的項目,如Windows Form(DataGridView),Web Form(GridView)等可以顯示信息的結果,您不能返回Anonymous類型的列表。我試圖使用你的擴展,但我不知道IsScalar()是在哪裏聲明的。 – 2014-10-31 16:57:02

+0

標量是在另一個庫中,你可以把它拉出來 – 2014-10-31 17:03:07

0

他們關鍵是使用LINQ查詢結果作爲其實現IList接口。 如果您收到的結果作爲一個參數上的方法作爲一個IList對象,你可以訪問它的行和列,這樣說:

var props = item.GetType().GetProperties(); 

參考這個例子中,它是一個小類請你只注意它抽象DataTable的創建,並且裏面有一個叫做「LINQToDataTable」的靜態方法,你應該使用它。

  1. 步驟1,創建一個名爲 「GridHelper」 類(使用System.Data DataTable的用於結構)

    public class GridHelper 
    { 
    private DataTable baseDt; 
    
    public GridHelper(string tableName) 
    { 
        baseDt = new DataTable(tableName); 
    } 
    
    
    public DataTable getDataTable() 
    { 
        return baseDt; 
    } 
    
    public object[,] getObjToFill() 
    { 
        object[,] obj = new object[baseDt.Columns.Count, 2]; 
        for (int i = 0; i < baseDt.Columns.Count; i++) 
        { 
         obj[i, 0] = baseDt.Columns[i].ColumnName; 
        } 
    
        return obj; 
    } 
    
    public void addColumn(string colName, Type valueType) 
    { 
        baseDt.Columns.Add(colName, valueType); 
    } 
    
    public void addRow(object[,] values) 
    { 
    
        DataRow newRow = baseDt.NewRow(); 
    
        for (int i = 0; i < values.Length/2; i++) 
        { 
         bool colFound = false; 
    
         for (int j = 0; j < baseDt.Columns.Count; j++) 
         { 
          if (baseDt.Columns[j].ColumnName == values[i, 0].ToString()) 
          { 
           colFound = true; 
           break; 
          } 
         } 
         if (colFound == false) 
         { 
          throw new Exception("The column " + values[i, 0].ToString() + " has not been added yet."); 
         } 
    
         newRow[values[i, 0].ToString()] = values[i, 1]; 
        } 
    
        baseDt.Rows.Add(newRow); 
    
    } 
    
    
    public static DataTable LINQToDataTable<T>(T objToList) where T : System.Collections.IList 
    { 
    
    
        GridHelper ghResult = new GridHelper("Report"); 
    
    
        foreach (Object item in objToList) 
        { 
         var props = item.GetType().GetProperties(); 
    
         foreach (var prop in props) 
         { 
          ghResult.addColumn(prop.Name, typeof(string)); 
          //prop.Name 
          //prop.GetValue(item) 
         } 
    
         break; 
        } 
    
        object[,] obj = ghResult.getObjToFill(); 
    
    
    
    
        foreach (Object item in objToList) 
        { 
         var props = item.GetType().GetProperties(); 
         int index = 0; 
         foreach (var prop in props) 
         { 
          //ReportValue(prop.Name, prop.GetValue(item, null)); 
          //prop.Name 
          obj[index, 1] = prop.GetValue(item); 
          index++; 
         } 
    
         ghResult.addRow(obj); 
        } 
    
    
        return ghResult.getDataTable(); 
    } 
    
    
    
    } 
    
  2. 用法:

    var listaReporte = 
         (from t in dbContext.TablaPruebas 
         select new 
         { 
          Name = t.name, 
          Score = t.score 
         } 
         ) .ToList(); 
    
        DataTable dt = Library.GridHelper.LINQToDataTable(listaReporte); 
    
  3. ,那就是,用你的數據表如您所願,在GridView或DataGridView上