代码之家  ›  专栏  ›  技术社区  ›  RaYell

用C中的LINQ填充数据表#

  •  2
  • RaYell  · 技术社区  · 16 年前

    我的应用程序中有一个方法可以填充 DataTable 数据使用以下代码:

    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实现相同的功能,以便稍微缩短这段代码。有什么想法吗?

    3 回复  |  直到 16 年前
        1
  •  1
  •   pete blair    16 年前

    好吧,这段代码不短,也不是linq,但我做了一个extension方法,它使用一个ilist,并将它转换为一个数据表。

        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;
        }
    
        2
  •  1
  •   Shaun    16 年前

    是的,简单点

        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上的属性与datatable列相同。

        3
  •  0
  •   Prashant Cholachagudda    16 年前

    首先确定是否可以查询 this.mailItem.Attachments 和 如果可能,可以将查询结果从由创建的扩展方法转换为数据表 Steve Sloka