Bevölkern Datatable mit LINQ in C #
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?
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 ...