Hier ist mein C # -Code
Employee objEmp = new Employee();
List<Employee> empList = new List<Employee>();
foreach (DataRow dr in ds.Tables[0].Rows)
{
empList.Add(new Employee { Name = Convert.ToString(dr["Name"]), Age = Convert.ToInt32(dr["Age"]) });
}
Es verwendet eine Schleife, um eine Liste aus einem Datensatz zu erstellen. Gibt es eine direkte Methode oder eine kürzere Methode oder einen Zeilencode, um den Datensatz in eine Liste zu konvertieren
Versuchen Sie so etwas:
var empList = ds.Tables[0].AsEnumerable().Select(dataRow => new Employee{Name = dataRow.Field<string>("Name")}).ToList();
Hier ist die Erweiterungsmethode zum Konvertieren von DataTable in eine Objektliste:
public static class Extensions
{
public static List<T> ToList<T>(this DataTable table) where T : new()
{
IList<PropertyInfo> properties = typeof(T).GetProperties().ToList();
List<T> result = new List<T>();
foreach (var row in table.Rows)
{
var item = CreateItemFromRow<T>((DataRow)row, properties);
result.Add(item);
}
return result;
}
private static T CreateItemFromRow<T>(DataRow row, IList<PropertyInfo> properties) where T : new()
{
T item = new T();
foreach (var property in properties)
{
if (property.PropertyType == typeof(System.DayOfWeek))
{
DayOfWeek day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), row[property.Name].ToString());
property.SetValue(item,day,null);
}
else
{
if(row[property.Name] == DBNull.Value)
property.SetValue(item, null, null);
else
property.SetValue(item, row[property.Name], null);
}
}
return item;
}
}
verwendung:
List<Employee> lst = ds.Tables[0].ToList<Employee>();
@ itay.b CODE EXPLAINED: Wir haben zuerst alle Eigenschaftsnamen aus der Klasse T mit Reflection gelesen
dann iterieren wir durch alle Zeilen in datatable und erstellen ein neues Objekt von T,
Dann setzen wir die Eigenschaften des neu erstellten Objekts mit Reflection.
Die Eigenschaftswerte werden aus der entsprechenden Spaltenzelle der Zeile ausgewählt.
PS: Name der Klasseneigenschaft und Name der Tabellenspalte müssen identisch sein
var myData = ds.Tables[0].AsEnumerable().Select(r => new Employee {
Name = r.Field<string>("Name"),
Age = r.Field<int>("Age")
});
var list = myData.ToList(); // For if you really need a List and not IEnumerable
Versuchen Sie dies .... Ändern Sie den Code gemäß Ihren Anforderungen.
List<Employee> target = dt.AsEnumerable()
.Select(row => new Employee
{
Name = row.Field<string?>(0).GetValueOrDefault(),
Age= row.Field<int>(1)
}).ToList();
Fügen Sie eine neue Klasse mit dem Namen "Helper" hinzu und ändern Sie die Eigenschaft der Klasse in "public static".
public static class Helper
{
public static List<T> DataTableToList<T>(this DataTable table) where T : class, new()
{
try
{
List<T> list = new List<T>();
foreach (var row in table.AsEnumerable())
{
T obj = new T();
foreach (var prop in obj.GetType().GetProperties())
{
try
{
PropertyInfo propertyInfo = obj.GetType().GetProperty(prop.Name);
propertyInfo.SetValue(obj, Convert.ChangeType(row[prop.Name], propertyInfo.PropertyType), null);
}
catch
{
continue;
}
}
list.Add(obj);
}
return list;
}
catch
{
return null;
}
}
}
und greifen Sie auf diese Klasse in Ihrem Code dahinter wie unten zu
DataTable dtt = dsCallList.Tables[0];
List<CallAssignment> lstCallAssignement = dtt.DataTableToList<CallAssignment>();
Ich konnte Nitin Sawants Antwort nicht zum Laufen bringen, aber ich konnte seinen Code so ändern, dass er für mich funktioniert. Im Wesentlichen musste ich GetRuntimeFields anstelle von GetProperties verwenden. Folgendes ist mir eingefallen:
public static class Extensions
{
public static List<T> ToList<T>(this DataTable table) where T : new()
{
IList<FieldInfo> fields = typeof(T).GetRuntimeFields().ToList();
List<T> result = new List<T>();
if (row.Table.Columns.Contains(field.Name))
{
foreach (var row in table.Rows)
{
var item = CreateItemFromRow<T>((DataRow)row, fields);
result.Add(item);
}
}
return result;
}
private static T CreateItemFromRow<T>(DataRow row, IList<FieldInfo> fields) where T : new()
{
T item = new T();
foreach (var field in fields)
{
if (row[field.Name] == DBNull.Value)
field.SetValue(item, null);
else
field.SetValue(item, row[field.Name]);
}
return item;
}
}
Verwenden Sie den folgenden Code:
using Newtonsoft.Json;
string JSONString = string.Empty;
JSONString = JsonConvert.SerializeObject(ds.Tables[0]);
Füllen Sie den Datensatz mit Daten aus, beispielsweise einem gespeicherten proc-Befehl
DbDataAdapter adapter = DbProviderFactories.GetFactory(cmd.Connection).CreateDataAdapter();
adapter.SelectCommand = cmd;
DataSet ds = new DataSet();
adapter.Fill(ds);
Holen Sie sich das Schema,
string s = ds.GetXmlSchema();
speichern Sie es in einer Datei, sagen Sie: datasetSchema.xsd. Generieren Sie die C # -Klassen für das Schema: (an der VS-Eingabeaufforderung)
xsd datasetSchema.xsd /c
Wenn Sie nun die DataSet-Daten in Klassen konvertieren müssen, können Sie die Deserialisierung durchführen (der Standardname für die generierte Stammklasse lautet NewDataSet):
public static T Create<T>(string xml)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (StringReader reader = new StringReader(xml))
{
T t = (T)serializer.Deserialize(reader);
reader.Close();
return t;
}
}
var xml = ds.GetXml();
var dataSetObjects = Create<NewDataSet>(xml);
DataSet ds = new DataSet();
ds = obj.getXmlData();// get the multiple table in dataset.
Employee objEmp = new Employee ();// create the object of class Employee
List<Employee > empList = new List<Employee >();
int table = Convert.ToInt32(ds.Tables.Count);// count the number of table in dataset
for (int i = 1; i < table; i++)// set the table value in list one by one
{
foreach (DataRow dr in ds.Tables[i].Rows)
{
empList.Add(new Employee { Title1 = Convert.ToString(dr["Title"]), Hosting1 = Convert.ToString(dr["Hosting"]), Startdate1 = Convert.ToString(dr["Startdate"]), ExpDate1 = Convert.ToString(dr["ExpDate"]) });
}
}
dataGridView1.DataSource = empList;