Frage

Dies ist eine direktere Frage, die von einem früheren stammt Allgemeinere Frage, die ich früher hatte Jetzt, wo ich mehr Zeit damit verbringe, ado.net zu suchen

Ich möchte ein ado.net -DataTable annehmen und das Äquivalent einer SQL -Auswahlabfrage mit aggregierten Funktionen (wie Summe) in einigen Spalten ausführen und nach festgelegt für die verbleibenden Spalten einstellen. Ich möchte dann das Ergebnis nehmen und es in einem Datagrid anzeigen.

Ich verstehe, dass ich eine Dataview eines DataTable erstellen kann, das Filterkriterien und Aggregatfunktionen enthält. Aber die MSDN -Seite über Ausdrücke Sag das

"Wenn Sie eine einzelne Tabelle verwenden, um ein Aggregat zu erstellen, würde es keine Gruppen-zu-by-Funktionalität geben. Stattdessen würden alle Zeilen den gleichen Wert in der Spalte anzeigen."

Wie bekomme ich Gruppen nach Typfunktionalität aus ado.net heraus, ohne meine Tabelle in eine separate Datenbank zu schreiben und dort eine Abfrage auszuführen? Gibt es eine Möglichkeit, dies zu tun, indem Sie eine zweite Tabelle erstellen oder verwenden?

War es hilfreich?

Lösung

Sie können die Gruppierungsfähigkeit von Linq verwenden, um dies zu erreichen. Außerdem können Sie ein Datagrid an eine LINQ -Abfrage binden, aber die Daten werden nur gelesen.

Eine Web -Suche nach LINQ -Gruppierung sollte Sie dorthin bringen, wo Sie gehen.

Andere Tipps

Eine Möglichkeit besteht darin, Ihr LINQ -Abfrageergebnis mithilfe von Reflexion in ein DataTable zu verwandeln. Hier ist ein Beispiel. Sobald Sie ein DataTable haben, haben Sie volle Groupby, Paging usw.

    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);
    }

Hier erfahren Sie, wie Sie es mit .net 3.x und höher (linq) machen:

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

Und so machen Sie es mit .NET 2.0 und unten (Standard ADP.NET).

http://codecorner.galanter.net/2009/04/20/group-by--aggregates-net-datatable/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top