Convierte DataSet a List

Aquí está mi código c #

Employee objEmp = new Employee(); List empList = new List(); foreach (DataRow dr in ds.Tables[0].Rows) { empList.Add(new Employee { Name = Convert.ToString(dr["Name"]), Age = Convert.ToInt32(dr["Age"]) }); } 

Utiliza un bucle para crear una lista a partir de un conjunto de datos. ¿Hay algún método directo o método más corto o un código de línea para convertir el conjunto de datos a la lista?

Pruebe algo como esto:

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

Aquí está el método de extensión para convertir DataTable a la lista de objetos:

  public static class Extensions { public static List ToList(this DataTable table) where T : new() { IList properties = typeof(T).GetProperties().ToList(); List result = new List(); foreach (var row in table.Rows) { var item = CreateItemFromRow((DataRow)row, properties); result.Add(item); } return result; } private static T CreateItemFromRow(DataRow row, IList 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; } } 

uso:

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

@ itay.b CÓDIGO EXPLICADO: Primero leemos todos los nombres de propiedad de la clase T usando la reflexión
luego iteramos a través de todas las filas en datatable y creamos un nuevo objeto de T,
luego establecemos las propiedades del objeto recién creado usando reflection.

Los valores de propiedad se seleccionan de la celda de columna correspondiente de la fila.

PD: el nombre de la propiedad de la clase y los nombres de las columnas de la tabla deben ser los mismos

 var myData = ds.Tables[0].AsEnumerable().Select(r => new Employee { Name = r.Field("Name"), Age = r.Field("Age") }); var list = myData.ToList(); // For if you really need a List and not IEnumerable 

Pruebe esto … modifique el código según sus necesidades.

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

Agregue una nueva clase llamada “Ayuda” y cambie la propiedad de la clase a “pública estática”

 public static class Helper { public static List DataTableToList(this DataTable table) where T : class, new() { try { List list = new List(); 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; } } } 

y acceda a esta clase en su código detrás como a continuación

  DataTable dtt = dsCallList.Tables[0]; List lstCallAssignement = dtt.DataTableToList(); 

Llene el conjunto de datos con datos de, digamos un comando de proceso almacenado

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

Obtener el esquema,

 string s = ds.GetXmlSchema(); 

guárdelo en un archivo diga: datasetSchema.xsd. Genere las clases de C # para el esquema: (en el símbolo del sistema de VS)

 xsd datasetSchema.xsd /c 

Ahora, cuando necesite convertir los datos del DataSet a clases, puede deserializar (el nombre predeterminado dado a la clase raíz generada es NewDataSet):

 public static T Create(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(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 empList = new List(); 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

Usa el siguiente código:

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

No pude obtener la respuesta de Nitin Sawant para trabajar, pero pude modificar su código para que funcione para mí. Esencialmente, necesitaba usar GetRuntimeFields en lugar de GetProperties. Esto es lo que terminé con:

 public static class Extensions { public static List ToList(this DataTable table) where T : new() { IList fields = typeof(T).GetRuntimeFields().ToList(); List result = new List(); if (row.Table.Columns.Contains(field.Name)) { foreach (var row in table.Rows) { var item = CreateItemFromRow((DataRow)row, fields); result.Add(item); } } return result; } private static T CreateItemFromRow(DataRow row, IList 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; } } 

Pruebe lo anterior que se ejecutará con cualquier tipo de lista.

  public DataTable ListToDataTable(IList 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; } 
  List ListToGetJwToMfData = new List(); 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("Partygstin"), Partystate = master.Field("Partystate"), NatureOfTransaction = master.Field("NatureOfTransaction"), ChallanNo = master.Field("ChallanNo"), ChallanDate=master.Field("ChallanDate"), OtherJW_ChallanNo=master.Field("OtherJW_ChallanNo"), OtherJW_ChallanDate = master.Field("OtherJW_ChallanDate"), OtherJW_GSTIN=master.Field("OtherJW_GSTIN"), OtherJW_State = master.Field("OtherJW_State"), InvoiceNo = master.Field("InvoiceNo"), InvoiceDate=master.Field("InvoiceDate"), Description =master.Field("Description"), UQC= master.Field("UQC"), qty=master.Field("qty"), TaxValue=master.Field("TaxValue"), Id=master.Field("Id") }).ToList();