2009-12-22 3 views
2

Étant donné un datatable, je souhaite sortir un type IEnumerable (dictionnaire (de T) serait parfait, sinon une datable serait acceptable) qui fournit une agrégation des données dans le datatable.Effectuer une agrégation sur un DataTable avec Linq dans vb.net

Dans SQL Je voudrais écrire la requête en tant que tel:

select groupByColumn, sum(someNumber) from myTable group by groupByColumn 

En VB.NET le plus proche je suis arrivé à ce (réalisé à l'aide des informations here) est:

' dt is a datatable containing two columns, referred to by index in p below 
Dim q = From p In dt Group p By p(0) Into Sum(p(1)) Select p(0), SumOfNumber = Sum 

Cependant, je reçois erreur: "Le nom de la variable Range ne peut être déduit qu'à partir d'un nom simple ou qualifié sans argument." sur l'élément p (0).

Par conséquent, ma question est la suivante:

  1. Comment puis-je résoudre ce problème?
  2. Comment puis-je traiter le résultat (q) en tant que type IEnumerable?

La vie n'est pas rendue plus facile parce que j'utilise Linq dans vb.net peu familier. Beaucoup d'exemples sont en C#, mais je n'ai pas vraiment trouvé quelque chose de convenable même en C#.

Répondre

1

Résolu: Je devais alias les colonnes retournées.

Dim q = From p In dt 
    Group p By transactionTypeName = p(0) _ 
    Into totalForType = Sum(Convert.ToDouble(p(1))) _ 
    Select transactionTypeName, totalForType 

Notez également que je devais faire une conversion sur la valeur que je sommateur parce qu'être un datatable dynamique de retour n'a pas eu le type de colonne spécifiée.

Conseil a trouvé here parce vb.net oh si nous donne obligeamment un message d'erreur différent de C# 's « membre type anonyme non valide déclarateur. Membres de type anonyme doivent être déclarés avec une affectation de membre, nom simple ou l'accès des membres. »

Pour être complet, les résultats sont traités comme suit:

For Each item In q ' no need for defining item as a type (in C# we'd use the var keyword) 
    If item.totalForType = magicNumber Then 
     'do something 
    Else 
     'do something else 
    End If 
Next 
+0

Il existe une méthode d'extension ToDictonary, comme dans q.ToDictionary ... – AMissico

Questions connexes