2011-05-09 7 views
4

J'ai un objet appelé Result<T> qui a un constructeur qui accepte un argument de IEnumerable<T>. J'aimerais pouvoir transmettre un datatable si possible.Convertir datatable en IEnumerable <T> pour passer au résultat <T> (IEnumerable <T> data);

J'ai essayé datatable.AsEnumerable(), mais où je lierais les données, il se plaignait que 'MyProperty' n'est pas un champ ou une propriété sur le type 'DataRow' - ce qui est logique puisque 'MyProperty' n'est pas une propriété sur 'DataRow' , mais c'était une colonne dans mon datatable.

Existe-t-il un moyen de convertir une donnée en quelque chose que je peux transmettre dans l'objet résultat et l'avoir toujours en liaison avec, disons, une vue de grille?

+0

Pourquoi ne pas utiliser Entity Framework? –

Répondre

1

Je fini par utiliser LINQ pour convertir la datatable dans un tableau d'objets anonymes.

Dim objs = From row In dt Select New With { 
    .Id = row.Field(Of Integer)("Id"), 
    .Count = row.Field(Of Integer)("Count") 
} 

Ensuite, je crée une fonction générique d'utiliser l'inférence de type pour obtenir le tableau d'objets anonyme dans le constructeur de l'objet Résultat

Private Function GetResult(Of T)(ByVal data As IEnumerable(Of T)) As Result(Of T) 
    Return New Result(Of T)(Nothing, data) 
End Function 

Appelé à l'aide Dim result = GetResult(objs)

3

Si vous pouvez écrire une fonction qui peut construire une instance de l'objet qui a « MyProperty » en utilisant un seul DataRow, vous pouvez le faire comme ceci:

datatable.AsEnumerable().Select(MyConversionFunction); 
+2

IIRC, c'est dtatable.Rows.AsEnumerable() –

+0

@Cylon Cat - Nope, c'est [en fait pas] (http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable.aspx) . –

+0

Je suis assis corrigé! –

0

Que diriez-vous

table.Rows.Cast<DataRow>() 
+0

Qu'est-ce que cela ferait? Ne courriez-vous pas encore le même problème? 'MyProperty' ne serait pas une propriété sur une instance DataRow. – adam0101

+0

bien, cela devrait vous donner les lignes, et vous pouvez en effet accéder à chaque colonne sur chaque ligne, par exemple dans un pour chaque boucle qui serait 'Pour Chaque ligne comme DataRow Dans les lignes \t Dim val = row (" MyProperty ") Next' – bottlenecked

0

Si vous voulez convertir votre datable dactylographié en EnumerableRowCollection vous pouvez utiliser ce qui suit:

EnumerableRowCollection<YourTypedRow> typedRowCollection = datatable.AsEnumerable().Cast<YourTypedRow>(); 
Questions connexes