Si está usando .NET 3.5, puede usar DataTableExtensions.AsEnumerable(un método de extensión) y luego, si realmente necesita un en List<DataRow>lugar de solo IEnumerable<DataRow>puede llamar Enumerable.ToList:
@Pandiya: Hay varias formas de convertir datos a JSON en .NET. Personalmente, siempre he usado la biblioteca JSON.NET, pero también hay otros enfoques.
@ Jon Skeet: Quiero obtener el valor en DataRow. ¿Hay algún método? En lugar de obtener como list.ItemArray [0].
Ramesh Durai
@ Jon, para su información: dt.AsEnumerable (). ToList () 'System.Data.EnumerableRowCollection <System.Data.DataRow>' no contiene una definición para 'ToList'
Pradip
66
List<Employee> emp =newList<Employee>();//Maintaining DataTable on ViewState//For Demo onlyDataTable dt =ViewState["CurrentEmp"]asDataTable;//read data from DataTable //using lamdaexpression
emp =(fromDataRow row in dt.RowsselectnewEmployee{_FirstName= row["FirstName"].ToString(),_LastName= row["Last_Name"].ToString()}).ToList();
El código anterior puede no funcionar bcs. dt.Rows no ha implementado 'AsEnumerable'. Esto se puede corregir de la siguiente manera: emp = (desde la fila DataRow en dt.AsEnumerable () seleccione un nuevo Empleado {_FirstName = row ["FirstName"]. ToString (), _LastName = row ["Last_Name"]. ToString ()}) .Listar();
hacer esto ha ayudado al rendimiento con solo usar un foreach sobre un datarow en un 50% de tiempo.
lloydom
33
Podrías usar
List<DataRow>list=newList<DataRow>(dt.Select());
dt.Select()devolverá todas las filas de su tabla, como una matriz de líneas de datos, y el Listconstructor acepta esa matriz de objetos como un argumento para llenar inicialmente su lista.
No funciona: consulte dotnetfiddle.net/I22r2c También debe tenerse en cuenta que el uso de Reflection es lento y no se recomienda en el código crítico de rendimiento.
Almenon
Debe agregar información del tipo de datos para las columnas. DataTable dt = new DataTable (); dt.Columns.Add ("id", typeof (Int32)); dt.Columns.Add ("nombre", typeof (String)); dt.Columns.Add ("foo", typeof (DateTime)); for (int i = 0; i <= 1000; i ++) {dt.Rows.Add (i, "foo", DateTime.Now);}
Rahul Garg
Funciona ahora. Gracias.
Almenon
14
Si solo desea que se devuelva una lista de valores del campo int "ID", puede usar ...
List<int> ids =(from row in dt.AsEnumerable()selectConvert.ToInt32(row["ID"])).ToList();
DataTable.Select() no da las Filas en el orden en que estaban presentes en la tabla de datos.
Si el orden es importante, creo que iterar sobre la colección de datos y formar una Lista es el camino correcto o también podría usar la sobrecarga de DataTable.Select(string filterexpression, string sort).
Pero esta sobrecarga puede no manejar todos los pedidos (como ordenar por caso ...) que proporciona SQL.
DataTable dt;// datatable should contains datacolumns with Id,NameList<Employee> employeeList=newList<Employee>();// Employee should contain EmployeeId, EmployeeName as propertiesforeach(DataRow dr in dt.Rows){
employeeList.Add(newEmployee{EmployeeId=dr.Id,EmplooyeeName=dr.Name});}
/* This is a generic method that will convert any type of DataTable to a List
*
*
* Example : List< Student > studentDetails = new List< Student >();
* studentDetails = ConvertDataTable< Student >(dt);
*
* Warning : In this case the DataTable column's name and class property name
* should be the same otherwise this function will not work properly
*/
Las siguientes son las dos funciones en las que si pasamos una DataTable y una clase definida por el usuario. Luego devolverá la Lista de esa clase con los datos de DataTable.
publicstaticList<T>ConvertDataTable<T>(DataTable dt){List<T> data =newList<T>();foreach(DataRow row in dt.Rows){
T item =GetItem<T>(row);
data.Add(item);}return data;}privatestatic T GetItem<T>(DataRow dr){Type temp =typeof(T);
T obj =Activator.CreateInstance<T>();foreach(DataColumn column in dr.Table.Columns){foreach(PropertyInfo pro in temp.GetProperties()){//in case you have a enum/GUID datatype in your model//We will check field's dataType, and convert the value in it.if(pro.Name== column.ColumnName){try{var convertedValue =GetValueByDataType(pro.PropertyType, dr[column.ColumnName]);
pro.SetValue(obj, convertedValue,null);}catch(Exception e){//ex handle code throw;}//pro.SetValue(obj, dr[column.ColumnName], null);}elsecontinue;}}return obj;}
Este método verificará el tipo de datos del campo y convertirá el valor de dataTable en ese tipo de datos.
Cambie el nombre de la clase del estudiante y el valor dt según sus requisitos. En este caso, el nombre de la columna DataTable y el nombre de la propiedad de clase deberían ser los mismos, de lo contrario, esta función no funcionará correctamente.
Gracias por tu respuesta. Sería genial si también agregara una breve explicación y algunos comentarios a su código. Esto ayuda a las personas a comprender mejor su respuesta.
Andre Hofmeister el
0
Esto funcionó para mí:
necesito al menos .Net Framework 3.5, el
siguiente código muestra DataRow convertido en Generic.IEnumerable, comboBox1 se ha utilizado para una mejor ilustración.
using System.Linq;DataTable dt =newDataTable();
dt = myClass.myMethod();List<object>list=(from row in dt.AsEnumerable()select(row["name"])).ToList();
comboBox1.DataSource=list;
publicstaticclassExtensions{#region Convert Datatable To ListpublicstaticIList<T>ToList<T>(thisDataTable table)where T :new(){IList<PropertyInfo> properties =typeof(T).GetProperties().ToList();IList<T> result =newList<T>();foreach(var row in table.Rows){var item =CreateItemFromRow<T>((DataRow)row, properties);
result.Add(item);}return result;}privatestatic T CreateItemFromRow<T>(DataRow row,IList<PropertyInfo> properties)where T :new(){
T item =new T();foreach(var property in properties){
property.SetValue(item, row[property.Name],null);}return item;}#endregion}
Para asignar las filas de DataTable a la lista genérica de clase
List<Candidate> temp =newList<Candidate>();//List that holds the Candidate Class,//Note:The Candidate class contains RollNo,Name and Department//tb is DataTable
temp =(fromDataRow dr in tb.RowsselectnewCandidate(){RollNO=Convert.ToInt32(dr["RollNO"]),Name= dr["Name"].ToString(),Department= dr["Department"].ToString(),}).ToList();
puedes usar las siguientes dos funciones genéricas
privatestaticList<T>ConvertDataTable<T>(DataTable dt){List<T> data =newList<T>();foreach(DataRow row in dt.Rows){
T item =GetItem<T>(row);
data.Add(item);}return data;}privatestatic T GetItem<T>(DataRow dr){Type temp =typeof(T);
T obj =Activator.CreateInstance<T>();foreach(DataColumn column in dr.Table.Columns){foreach(PropertyInfo pro in temp.GetProperties()){if(pro.Name== column.ColumnName)
pro.SetValue(obj, dr[column.ColumnName].ToString(),null);elsecontinue;}}return obj;}
Respuestas:
Si está usando .NET 3.5, puede usar
DataTableExtensions.AsEnumerable
(un método de extensión) y luego, si realmente necesita un enList<DataRow>
lugar de soloIEnumerable<DataRow>
puede llamarEnumerable.ToList
:o
fuente
list
a json.fuente
Con C # 3.0 y System.Data.DataSetExtensions.dll,
fuente
Podrías usar
dt.Select()
devolverá todas las filas de su tabla, como una matriz de líneas de datos, y elList
constructor acepta esa matriz de objetos como un argumento para llenar inicialmente su lista.fuente
Puede crear una función de extensión como:
fuente
Si solo desea que se devuelva una lista de valores del campo int "ID", puede usar ...
fuente
He agregado algunas modificaciones al código de esta respuesta ( https://stackoverflow.com/a/24588210/4489664 ) porque para los tipos anulables devolverá una excepción
fuente
fuente
Nuevamente, usando 3.5 puede hacerlo como:
BRGDS
fuente
Aquí hay un método de extensión DataTable que convierte una DataTable en una lista genérica.
https://gist.github.com/gaui/a0a615029f1327296cf8
Uso:
fuente
Una forma más 'mágica', y no necesita .NET 3.5.
Si, por ejemplo,
DBDatatable
devuelve una sola columna de Guías (identificador único en SQL), puede usar:fuente
fuente
DataTable.Select()
no da las Filas en el orden en que estaban presentes en la tabla de datos.Si el orden es importante, creo que iterar sobre la colección de datos y formar una Lista es el camino correcto o también podría usar la sobrecarga de
DataTable.Select(string filterexpression, string sort)
.Pero esta sobrecarga puede no manejar todos los pedidos (como ordenar por caso ...) que proporciona SQL.
fuente
fuente
Use el
System.Data
espacio de nombres y obtendrá.AsEnumerable()
.fuente
fuente
Esto funcionó para mí: necesito al menos .Net Framework 3.5, el siguiente código muestra DataRow convertido en Generic.IEnumerable, comboBox1 se ha utilizado para una mejor ilustración.
fuente
Salida
fuente
Podemos usar un método genérico para convertir
DataTable
a enList
lugar de convertir manualmenteDataTable
aList
.Nota:
DataTable
'sColumnName
yType
' sPropertyName
debe ser el mismo.Llame al siguiente método:
fuente
Puede usar un método genérico como ese para datatable a lista genérica
fuente
Convertir
DataTable
a genéricoDictionary
fuente
Usar extensión:
fuente
Para asignar las filas de DataTable a la lista genérica de clase
fuente
La forma más fácil de convertir DataTable en la lista genérica de clase
usando Newtonsoft.Json;
fuente
puedes usar las siguientes dos funciones genéricas
y úsalo de la siguiente manera
fuente
Enlace al ejemplo de trabajo DotNetFiddle
}
fuente