2010-05-26 6 views
5

J'ai un DataSet et je veux convertir le DataSet en List<T>jeu de données à la liste <T> LINQ

T - objet de type

Comment convertir mes DataSet? Il a 10 colonnes, avec les 10 propriétés de mon objet et il renvoie plus de 15000 lignes. Je veux retourner cet ensemble de données en List<obj> et en boucle comment dois-je faire cela?

Répondre

16

Ceci est à peu près la même chose que les autres réponses, mais introduit des colonnes fortement typées.

var myData = ds.Tables[0].AsEnumerable().Select(r => new { 
    column1 = r.Field<string>("column1"), 
    column2 = r.Field<int>("column2"), 
    column3 = r.Field<decimal?>("column3") 
}); 
var list = myData.ToList(); // For if you really need a List and not IEnumerable 
+0

Dommage que je ne puisse pas faire un +2! Tks tellement – Pascal

4

Je pense que cela devrait le faire.

var output = yourDataSet.Tables[0].Rows.Cast<DataRow>().Select(r => new 
{ 
    Column1 = r["Column1"].ToString(), 
    Column2 = r["Column2"].ToString(), 
    Column3 = r["Column3"].ToString(), 
    Column4 = r["Column4"].ToString(), 
    Column5 = r["Column5"].ToString(), 
    Column6 = r["Column6"].ToString(), 
    Column7 = r["Column7"].ToString(), 
    Column8 = r["Column8"].ToString(), 
    Column9 = r["Column9"].ToString(), 
    Column10 = r["Column10"].ToString() 
}).ToList(); 
+0

+1 S'il vous plaît excuser mon ignorance, mais est-ce LINQ ? (Je n'ai pas encore appris LINQ) – JohnB

+0

Oui c'est. Il parcourt à peu près toutes les lignes de la Table [0], puis crée une Liste d'un nouveau type anonyme qui possède des propriétés pour toutes les colonnes. Je ne l'ai pas testé, donc il pourrait y avoir quelques problèmes :) – Kelsey

+1

C'est une sorte de linq - faire une utilisation directe des fonctionnalités sous-jacentes (expressions lambda + méthodes d'extension + fermetures + types anonymes) qui rendent la syntaxe de compréhension de requête linq possible. –

4

Tout d'abord, vous êtes sur la bonne voie, mais vous devriez penser en termes de IEnumerable<T> plutôt que List<T>. Et voici comment vous le faire:

var myData = ds.Tables[0].AsEnumerable() 
        .Select(r => new {column1 = r[0].ToString(), 
            column2 = r[1].ToString() 
            /*etc*/ 
          }); 

jamais convertir un IEnumerable une liste avant que vous devez absolument.

+0

Je ne l'ai pas testé mais ne ferait-il pas un IEnumberable ? Tables [0] renvoie un DataTable où Tables [0] .Rows renvoie 'DataRowCollection'. – Kelsey

+0

@Kelsey - Il existe une méthode d'extension spéciale 'AsEnumerable' sur DataTable qui renvoie' IEnumerable '. – Greg

+0

@Greg oooooh ne savais pas que ... intellisense pour tester mon code aurait aidé :) – Kelsey

-1

Je sais @bharat demandé une solution à l'aide de LINQ, mais surtout pour moi-même je voulais comparer @ solution de Kelsey à la ancienne façon de le faire:

List<Obj> list = new List<Obj>(); 

foreach (DataRow r in yourDataSet.Tables[0].Rows) 
{ 
    Obj obj = new Obj(); 
    obj.Column1 = r["Column1"]; 
    obj.Column2 = r["Column2"]; 
    obj.Column3 = r["Column3"]; 
    obj.Column4 = r["Column4"]; 
    obj.Column5 = r["Column5"]; 
    obj.Column6 = r["Column6"]; 
    obj.Column7 = r["Column7"]; 
    obj.Column8 = r["Column8"]; 
    obj.Column9 = r["Column9"]; 
    obj.Column10 = r["Column10"]; 

    list.Add(obj); 
}

Ou par constructeur :

List<Obj> list = new List<Obj>(); 

foreach (DataRow r in yourDataSet.Tables[0].Rows) 
{ 
    Obj obj = new Obj(r["Column1"], r["Column2"], r["Column3"], r["Column4"], r["Column5"],r["Column6"], r["Column7"], r["Column8"], r["Column9"],r["Column10"]); 

    list.Add(obj); 
}

Je intentionnellement laissé de .ToString() parce que je pense l'utiliser dépend de la situation.

Questions connexes