it-swarm.com.de

DataSet in Liste konvertieren

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

51
iJade

Versuchen Sie so etwas:

var empList = ds.Tables[0].AsEnumerable().Select(dataRow => new Employee{Name = dataRow.Field<string>("Name")}).ToList();
80
Carra

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

30
Nitin Sawant
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
16
Fabian Bigler

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

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>();
2
vivek ramasamy

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;
    }
}
1
Jacob White

Verwenden Sie den folgenden Code:

using Newtonsoft.Json;
string JSONString = string.Empty;
JSONString = JsonConvert.SerializeObject(ds.Tables[0]);
1
Ajsatis

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

enter image description here

1
Jeetendra Negi