Question

C’est une question plus directe issue d’une précédente question plus générale que j'avais auparavant maintenant que j'ai passé plus de temps à chercher dans ADO.NET

Je veux utiliser un ADO.NET DataTable et effectuer l'équivalent d'une requête SQL SELECT avec des fonctions d'agrégat (telles que SUM) sur certaines colonnes et de GROUP BY défini pour les colonnes restantes. Je veux ensuite prendre le résultat et l'afficher dans un DataGrid.

Je comprends que je peux créer un DataView d'un DataTable contenant des critères de filtre et des fonctions d'agrégat. Mais la page MSDN sur Expressions indique que

"Si vous utilisez une seule table pour créer un agrégat, il n’existera aucune fonctionnalité de regroupement. Au lieu de cela, toutes les lignes afficheraient la même valeur dans la colonne. "

Comment puis-je obtenir une fonctionnalité de type GROUP BY dans ADO.NET sans écrire ma table dans une base de données séparée et y exécuter une requête? Y a-t-il un moyen de le faire en créant ou en utilisant un deuxième tableau?

Était-ce utile?

La solution

Vous pouvez utiliser la capacité de regroupement de LINQ pour accomplir cela. En outre, vous pouvez lier un DataGrid à une requête LINQ, mais les données seront en lecture seule.

Une recherche Web sur le groupement LINQ devrait vous mener là où vous allez.

Autres conseils

Une solution consiste à transformer le résultat de votre requête linq en un DataTable utilisant la réflexion. Voici un exemple. Une fois que vous avez un DataTable, vous aurez plein groupby, pagination, etc ...

    private static System.Data.DataTable ObjectArrayToDataTable(object[] data)
    {
        System.Data.DataTable dt = new System.Data.DataTable();
        // if data is empty, return an empty table
        if (data.Length == 0) return dt;

        Type t = data[0].GetType();
        System.Reflection.PropertyInfo[] piList = t.GetProperties();

        foreach (System.Reflection.PropertyInfo p in piList)
        {
            dt.Columns.Add(new System.Data.DataColumn(p.Name, p.PropertyType));
        }

        object[] row = new object[piList.Length];

        foreach (object obj in data)
        {
            int i = 0;
            foreach (System.Reflection.PropertyInfo pi in piList)
            {
                row[i++] = pi.GetValue(obj, null);
            }
            dt.Rows.Add(row);
        }

        return dt;
    }

    internal static DataTable GetAllStoredFileDetailsByUserID(int userID)
    {
        var db = GetDataContext();
        object[] result;
        try
        {
            result = (from files in db.Files
                      where files.OwnerUserID == userID && files.IsThumbnail == false
                      select new
                      {
                          FileID = files.FileID,
                          Name = files.Name,
                          DateCreated = files.DateCreated,
                          Size = files.Size,
                          FileHits = (from act in db.FileWebActivities where act.FileID == files.FileID select act).Count()
                      }).ToArray();
        }
        catch (Exception)
        {
           //omitted
        }
        return ObjectArrayToDataTable(result);
    }

Voici comment procéder à l'aide de .NET 3.x et versions ultérieures (LINQ):

http: //codecorner.galanter .net / 2009/12/17 / grouping-ado-net-datatable-using-linq /

Et voici comment procéder avec .NET 2.0 et versions ultérieures (ADP.NET standard)

http: // codecorner .galanter.net / 2009/04/20 / groupe-par-et-agrégats-dans-net-datatable /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top