2013-06-14 15 views
36

Hier ist mein C# -CodeConvert Datensatz zur Liste

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 eine Liste von einem dataset.Is dort direkte Verfahren oder kürzere Verfahren oder eine Zeile Code erstellen Datensatz konvertiert zur Liste

+0

Warum brauchen Sie es * in einer Zeile *? ist die aktuelle multi-lined form genauso einfach zu lesen? –

+3

@JensKloster was ist der Schaden in Wissen, wenn es in einer Zeile geschrieben werden könnte :) – iJade

Antwort

63

versuchen, etwas wie folgt aus:

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

das ist, was ich versucht habe --- var empList = ds.Tables [0] .AsEnumerable(). Wählen Sie (dataRow => neuer Mitarbeiter {Name = dataRow.Field ("Name"), Alter = dataRow.Field ("Alter")}). ToList(); sagt "Angegebene Besetzung ist nicht gültig" – iJade

+0

Dein Alter könnte dbnull sein? – Carra

+1

nein ist es nicht ..... – iJade

-1

die oben Versuchen, die mit jeder Listentyp ausgeführt wird.

public DataTable ListToDataTable<T>(IList<T> data) 
    { 
     PropertyDescriptorCollection props = 
      TypeDescriptor.GetProperties(typeof(T)); 
     DataTable table = new DataTable(); 
     for (int i = 0; i < props.Count; i++) 
     { 
      PropertyDescriptor prop = props[i]; 
      table.Columns.Add(prop.Name, prop.PropertyType); 
     } 
     object[] values = new object[props.Count]; 
     foreach (T item in data) 
     { 
      for (int i = 0; i < values.Length; i++) 
      { 
       values[i] = props[i].GetValue(item); 
      } 
      table.Rows.Add(values); 
     } 
     return table; 
    } 
15
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 
19

Hier Erweiterung Methode Datatable konvertieren zur 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; 
     } 
    } 

Nutzung:

List<Employee> lst = ds.Tables[0].ToList<Employee>(); 

@ itay.b CODE ERKLÄRT: Wir zuerst alle lesen die Eigenschaftsnamen aus der Klasse T unter Verwendung der Reflexion
dann durchlaufen wir alle Zeilen in der Datentabelle und erstellen ein neues Objekt von T,
dann legen wir die Eigenschaften des neu erstellten Objekts durch Reflexion fest.

Die Eigenschaftswerte werden aus der übereinstimmenden Spaltenzelle der Zeile ausgewählt.

PS: Klasse Eigenschaftsnamen und Tabellenspaltennamen müssen identisch sein

+0

können Sie bitte diesen Code erklären? –

+0

überprüfen Sie aktualisierte Antwort –

+0

Liebe diese, große Antwort und auch ein schönes Beispiel für Generika. – Simon

2

die Sie interessieren .... Ändern Sie den Code nach Ihren Bedürfnissen.

 List<Employee> target = dt.AsEnumerable() 
     .Select(row => new Employee 
     { 
     Name = row.Field<string?>(0).GetValueOrDefault(), 
     Age= row.Field<int>(1) 
     }).ToList(); 
+2

Nur ein kleiner Kommentar, aber Zeichenfolge ist bereits Nullable, keine Verwendung von String? – Carra

+0

Ich kann die ToList() Methode nicht finden, es kommt nicht – Blossom

1

Füllen Sie den Datensatz mit Daten aus, etwa eine gespeicherte Prozedur Befehl

DbDataAdapter adapter = DbProviderFactories.GetFactory(cmd.Connection).CreateDataAdapter(); 
adapter.SelectCommand = cmd; 
DataSet ds = new DataSet(); 
adapter.Fill(ds); 

das Schema holen

string s = ds.GetXmlSchema(); 

in einer Datei speichern sie sagen: datasetSchema.xsd.Generieren Sie die C# -Klassen für das Schema: (am VS-Eingabeaufforderung)

xsd datasetSchema.xsd /c 

Nun, wenn Sie die DataSet Daten in Klassen konvertieren müssen Sie deserialisieren können (der Standardname auf die erzeugte Wurzelklasse gegeben ist 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); 
+0

+1. Das bringt mich näher an die Antwort von [meine eigene XML-Serialisierungs-/Deserialisierungsfrage] (http://stackoverflow.com/questions/28652889/serializing-objects-into-xml-repository). –

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

0

Verwenden Sie den Code unten:

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

eine neue Klasse hinzufügen als „Helfer“ genannt und die Eigenschaft der Klasse ändern, um diese Klasse in Ihrem Code „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 Zugang hinter so wie unten

DataTable dtt = dsCallList.Tables[0]; 
List<CallAssignment> lstCallAssignement = dtt.DataTableToList<CallAssignment>(); 
-1
List<GSTEntity.gst_jobwork_to_mfgmaster> ListToGetJwToMfData = new List<GSTEntity.gst_jobwork_to_mfgmaster>(); 
      DataSet getJwtMF = new DataSet(); 
      getJwtMF = objgst_jobwork_to_mfgmaster_BLL.GetDataJobWorkToMfg(AssesseeId, PremiseId, Fyear, MonthId, out webex); 
      if(getJwtMF.Tables["gst_jobwork_to_mfgmaster"] != null) 
      { 

       ListToGetJwToMfData = (from master in getJwtMF.Tables["gst_jobwork_to_mfgmaster"].AsEnumerable() select new GSTEntity.gst_jobwork_to_mfgmaster { Partygstin = master.Field<string>("Partygstin"), Partystate = 
             master.Field<string>("Partystate"), NatureOfTransaction = master.Field<string>("NatureOfTransaction"), ChallanNo = master.Field<string>("ChallanNo"), ChallanDate=master.Field<int>("ChallanDate"), OtherJW_ChallanNo=master.Field<string>("OtherJW_ChallanNo"), OtherJW_ChallanDate = master.Field<int>("OtherJW_ChallanDate"), 
        OtherJW_GSTIN=master.Field<string>("OtherJW_GSTIN"), 
        OtherJW_State = master.Field<string>("OtherJW_State"), 
        InvoiceNo = master.Field<string>("InvoiceNo"), 
        InvoiceDate=master.Field<int>("InvoiceDate"), 
        Description =master.Field<string>("Description"), 
        UQC= master.Field<string>("UQC"), 
        qty=master.Field<decimal>("qty"), 
        TaxValue=master.Field<decimal>("TaxValue"), 
        Id=master.Field<int>("Id")       

       }).ToList(); 
+0

Bitte fügen Sie dem genannten Quellcode eine Erklärung hinzu. – Dominique