Frage

Ich habe eine Methode in meiner Anwendung, die DataTable mit den Daten mit dem folgenden Code auffüllt:

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);
}

ich mich gefragt, ob ich die gleiche Funktionalität LINQ, um unter Verwendung erreichen könnte diesen Code ein wenig zu verkürzen. Irgendwelche Ideen?

War es hilfreich?

Lösung

Nun dieser Code ist nicht kürzer oder Linq, aber ich habe eine Erweiterungsmethode, die eine IList nimmt und verwandelt es in eine Datentabelle für Sie.

    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;
    }

Andere Tipps

Ja, Easy

    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());
        }

Dies setzt voraus, dass die Eigenschaften auf T die gleichen wie die Datatable-Spalten sind.

Sie zunächst feststellen, ob Sie this.mailItem.Attachments abfragen können und wenn es möglich ist, können Sie Abfrageergebnis auf eine Datentabelle von Extension-Methode erstellen, indem Sie Steve Sloka ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top