2009-09-10 83 views
2

我有我的應用程序的方法用於填充DataTable使用下面的代碼中的數據:填充DataTable中使用LINQ在C#

DataTable dt = this.attachmentsDataSet.Tables["Attachments"]; 

foreach (Outlook.Attachment attachment in this.mailItem.Attachments) 
{ 
    DataRow dr = dt.NewRow(); 
    dr["Index"] = attachment.Index; 
    dr["DisplayName"] = String.Format(
     CultureInfo.InvariantCulture, 
     "{0} ({1})", 
     attachment.FileName, 
     FormatSize(attachment.Size)); 
    dr["Name"] = attachment.FileName; 
    dr["Size"] = attachment.Size; 

    dt.Rows.Add(dr); 
} 

我在想,如果我能做到,爲了縮短使用LINQ相同的功能這個代碼有點。有任何想法嗎?

+0

你用什麼數據表?它是用於db插入嗎? – spender 2009-09-10 12:41:57

+0

我沒有使用數據庫。這是填充列表框數據源。 – RaYell 2009-09-10 12:50:51

回答

1

嗯,這心不是代碼短或LINQ,但我沒有一個外部方法需要一個IList並將它變成一個DataTable給你。

public static DataTable ToDataTable<T>(this IList<T> theList) 
    { 
     DataTable theTable = CreateTable<T>(); 
     Type theEntityType = typeof(T); 

     // Use reflection to get the properties of the generic type (T) 
     PropertyDescriptorCollection theProperties = TypeDescriptor.GetProperties(theEntityType); 

     // Loop through each generic item in the list 
     foreach (T theItem in theList) 
     { 
      DataRow theRow = theTable.NewRow(); 

      // Loop through all the properties 
      foreach (PropertyDescriptor theProperty in theProperties) 
      { 
       // Retrieve the value and check to see if it is null 
       object thePropertyValue = theProperty.GetValue(theItem); 
       if (null == thePropertyValue) 
       { 
        // The value is null, so we need special treatment, because a DataTable does not like null, but is okay with DBNull.Value 
        theRow[theProperty.Name] = DBNull.Value; 
       } 
       else 
       { 
        // No problem, just slap the value in 
        theRow[theProperty.Name] = theProperty.GetValue(theItem); 
       } 
      } 

      theTable.Rows.Add(theRow); 
     } 

     return theTable; 
    } 
0

您首先確定是否可以查詢this.mailItem.Attachments和 如果可能的話,你可以將查詢結果轉換爲從擴展方法的DataTable通過Steve Sloka創造... ...

1

是,易

public void FillFromList(List<T> col) 
    { 
     Type elementType = typeof(T); 

     // Nested query of generic element list of property 
     // values (using a join to the DataTable columns) 
     var rows = from row in col 
        select new 
        { 
         Fields = from column in m_dataTable.Columns.Cast<DataColumn>() 
           join prop in elementType.GetProperties() 
            on column.Caption equals prop.Name 
           select prop.GetValue(row, null) 
        }; 

     // Add each row to the DataTable 
     int recordCount = 0; 
     foreach (var entry in rows) 
     { 
      m_dataTable.Rows.Add(entry.Fields.ToArray()); 
     } 

這假定T上的性質是一樣的數據表列。