Se você estiver usando o .NET 3.5, poderá usar DataTableExtensions.AsEnumerable(um método de extensão) e, se realmente precisar de um, em List<DataRow>vez de apenas, IEnumerable<DataRow>pode chamar Enumerable.ToList:
@ Pandiya: Existem várias maneiras de converter dados em JSON no .NET. Pessoalmente, sempre usei a biblioteca JSON.NET, mas também existem outras abordagens.
O código acima pode não funcionar bcs. O dt.Rows não implementou 'AsEnumerable'. Isso pode ser corrigido da seguinte forma: emp = (da linha DataRow em dt.AsEnumerable () selecione o novo funcionário {_FirstName = linha ["FirstName"]. ToString (), _LastName = row ["Last_Name"]. ToString ()}) .Listar();
fazer isso ajudou o desempenho usando apenas um foreach em uma datarow em 50% do tempo.
24512 lloydom
33
Você poderia usar
List<DataRow>list=newList<DataRow>(dt.Select());
dt.Select()retornará todas as linhas da sua tabela, como uma matriz de datarows, e o Listconstrutor aceita essa matriz de objetos como argumento para preencher inicialmente sua lista.
Não funciona - consulte dotnetfiddle.net/I22r2c . Observe também que o uso do Reflection é lento e não é recomendado no código crítico de desempenho.
Almenon
Você precisa adicionar informações de tipo de dados para colunas. DataTable dt = new DataTable (); dt.Columns.Add ("id", typeof (Int32)); dt.Columns.Add ("name", 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 agora. Obrigado.
Almenon
14
Se você quiser apenas uma lista de valores do campo int "ID" retornada, poderá usar ...
List<int> ids =(from row in dt.AsEnumerable()selectConvert.ToInt32(row["ID"])).ToList();
DataTable.Select() não fornece as linhas na ordem em que estavam presentes na tabela de dados.
Se a ordem é importante, sinto que iterar sobre a coleção da datarow e formar uma lista é o caminho certo a seguir ou você também pode usar a sobrecarga de DataTable.Select(string filterexpression, string sort) .
Mas essa sobrecarga pode não lidar com toda a ordem (como ordem por caso ...) que o SQL fornece.
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
*/
A seguir, estão as duas funções nas quais se passarmos uma DataTable e uma classe definida pelo usuário. Em seguida, ele retornará a lista dessa classe com os dados 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á o tipo de dados do campo e converterá o valor dataTable nesse tipo de dados.
Altere o nome da turma do aluno e o valor dt com base em seus requisitos. Nesse caso, o nome da coluna DataTable e o nome da propriedade da classe devem ser os mesmos, caso contrário, essa função não funcionará corretamente.
Obrigado pela sua resposta. Seria ótimo se você também adicionasse uma breve explicação e alguns comentários ao seu código. Isso ajuda as pessoas a entender melhor sua resposta.
Andre Hofmeister
0
Isso funcionou para mim:
preciso de pelo menos o .NET Framework 3.5, o
código abaixo exibe o DataRow voltado para Generic.IEnumerable, comboBox1 foi usado para uma melhor ilustração.
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 atribuir as linhas DataTable à lista genérica de classe
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();
você pode usar as seguintes duas funções 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;}
Respostas:
Se você estiver usando o .NET 3.5, poderá usar
DataTableExtensions.AsEnumerable
(um método de extensão) e, se realmente precisar de um, emList<DataRow>
vez de apenas,IEnumerable<DataRow>
pode chamarEnumerable.ToList
:ou
fonte
list
para json.fonte
Com C # 3.0 e System.Data.DataSetExtensions.dll,
fonte
Você poderia usar
dt.Select()
retornará todas as linhas da sua tabela, como uma matriz de datarows, e oList
construtor aceita essa matriz de objetos como argumento para preencher inicialmente sua lista.fonte
Você pode criar uma função de extensão como:
fonte
Se você quiser apenas uma lista de valores do campo int "ID" retornada, poderá usar ...
fonte
Eu adicionei algumas modificações ao código desta resposta ( https://stackoverflow.com/a/24588210/4489664 ) porque para tipos anuláveis retornará exceção
fonte
fonte
Novamente, usando o 3.5, você pode fazer o seguinte:
BRGDS
fonte
Aqui está um método de extensão DataTable que converte um DataTable em uma lista genérica.
https://gist.github.com/gaui/a0a615029f1327296cf8
Uso:
fonte
Uma maneira mais "mágica" e não precisa do .NET 3.5.
Se, por exemplo,
DBDatatable
estivesse retornando uma única coluna de Guids (identificador exclusivo no SQL), você poderia usar:fonte
fonte
DataTable.Select()
não fornece as linhas na ordem em que estavam presentes na tabela de dados.Se a ordem é importante, sinto que iterar sobre a coleção da datarow e formar uma lista é o caminho certo a seguir ou você também pode usar a sobrecarga de
DataTable.Select(string filterexpression, string sort)
.Mas essa sobrecarga pode não lidar com toda a ordem (como ordem por caso ...) que o SQL fornece.
fonte
fonte
Use o
System.Data
namespace e você receberá.AsEnumerable()
.fonte
fonte
Isso funcionou para mim: preciso de pelo menos o .NET Framework 3.5, o código abaixo exibe o DataRow voltado para Generic.IEnumerable, comboBox1 foi usado para uma melhor ilustração.
fonte
Resultado
fonte
Podemos usar um método genérico para converter
DataTable
para emList
vez de converter manualmente umDataTable
paraList
.Nota:
DataTable
'ColumnName
eType
'PropertyName
devem ser os mesmos.Chame o método abaixo:
fonte
Você pode usar um método genérico como esse para lista de tabela de dados para genérica
fonte
Convertendo
DataTable
para genéricoDictionary
fonte
Usar extensão:
fonte
Para atribuir as linhas DataTable à lista genérica de classe
fonte
A maneira mais fácil de converter o DataTable na lista genérica de classe
using Newtonsoft.Json;
fonte
você pode usar as seguintes duas funções genéricas
e use-o da seguinte maneira
fonte
Link para o exemplo do DotNetFiddle em funcionamento
}
fonte