2017-09-25 3 views
1

J'ai une classe R avec quelques propriétés.Impossible de convertir le type 'System.Data.EnumerableRowCollection <System.Data.DataRow>' en generic.list <T>

De même j'ai une DataTabledt avec des colonnes exactement les mêmes que les propriétés de la classe R

Je suis en train de créer deux différents DataTables de ce qui précède dit DataTabledt basée sur une condition sur l'une des colonnes du dt.

Et je veux convertir ces 2 Datatables en List de R objets.

Voilà comment je suis en train avec maintenant des progrès:

List<R> Sheet1 = dt.AsEnumerable() 
    .Where(row => Convert.ToDecimal(row["SomeDecimalColumn"]) <= Convert.ToDecimal(80)); 

List<R> Sheet2 = dt.AsEnumerable() 
    .Where(row => Convert.ToDecimal(row["SomeDecimalColumn"]) > Convert.ToDecimal(80)); 

Mais il renvoie une erreur:

Cannot convert type 'System.Data.EnumerableRowCollection' to generic.list

J'ai essayé de faire toutes sortes de casting, mais sans utilisation:

List<R> Sheet1 = (List<R>)dt.AsEnumerable() 
    .Where(row => Convert.ToDecimal(row["SomeDecimalColumn"]) <= Convert.ToDecimal(80)); 

List<R> Sheet2 = (List<R>)dt.AsEnumerable() 
    .Where(row => Convert.ToDecimal(row["SomeDecimalColumn"]) > Convert.ToDecimal(80)); 

List<R> Sheet1 = (List<R>)dt.AsEnumerable() 
    .Where(row => Convert.ToDecimal(row["SomeDecimalColumn"]) <= Convert.ToDecimal(80)) 
    .ToList(); 

List<R> Sheet2 = (List<R>)dt.AsEnumerable() 
    .Where(row => Convert.ToDecimal(row["SomeDecimalColumn"]) > Convert.ToDecimal(80)) 
    .ToList(); 
+1

Qu'est-ce ici 'R'? Essayez d'utiliser la méthode 'st.Select' ou utilisez' var' au lieu de Liste

+1

Qu'est-ce que 'R'? Si ce n'est pas une sous-classe de 'System.Data.Row', vous devrez écrire du code pour initialiser un nouveau' R' à partir d'un 'System.Data.Row' existant. Le casting n'est pas magique. Quand vous lancez A à B, A doit être * un * B, ou il doit y avoir du code invoqué qui convertit un A * en * un B. –

+1

Vous avez vraiment des classes comme 'R'? Des noms plus courts n'étaient pas disponibles? Je suppose que votre première classe était 'A' –

Répondre

2

Votre instruction Where renvoie EnumerableRowCollection<DataRow>. Vous devez sélectionner un List de R de votre requête pour faire cela fonctionne:

List<R> Sheet1 = dt.AsEnumerable(). 
     Where(row => Convert.ToDecimal(row["SomeDecimalColumn"]) <= Convert.ToDecimal(80)) 
    .Select(c => new R 
     { SomeDecimalColumn = Convert.ToDecimal(c["SomeDecimalColumn"]) /*other propertie*/ }) 
    .ToList();