2 Stimmen

Eine bessere DataTable

Ich habe eine Anwendung, die DataTables verwendet, um die Gruppierung, Filterung und Aggregation von Daten durchzuführen. Ich möchte Datentabellen durch meine eigenen Datenstrukturen ersetzen, damit wir keinen unnötigen Overhead haben, den wir durch die Verwendung von Datentabellen bekommen. Meine Frage ist also, ob Linq verwendet werden kann, um die Gruppierung, Filterung und Aggregation meiner Daten durchzuführen, und wenn ja, ist die Leistung mit der von Datentabellen vergleichbar, oder sollte ich mich einfach zurücklehnen und meine eigenen Algorithmen schreiben, um dies zu tun?

Danke

Dan R.

2voto

Marc Gravell Punkte 970173

Wenn Sie sich nicht für einfache Klassen (POCO usw.) entscheiden, wird Ihre eigene Implementierung wahrscheinlich fast so viel Overhead haben wie DataTable . Ich persönlich würde eher auf Tools wie LINQ-to-SQL, Entity Framework usw. zurückgreifen. Dann können Sie entweder LINQ-to-Objects gegen lokale Daten oder die anbieterspezifische Implementierung für komplexe Datenbankabfragen verwenden, ohne alle Daten auf den Client zu ziehen.

LINQ-to-Objects kann do all die von Ihnen erwähnten Dinge, aber es geht darum, alle Daten im Speicher zu haben. Wenn Sie nicht-triviale Daten haben, wird eine Datenbank empfohlen. SQL Server Express Edition wäre ein guter Ausgangspunkt, wenn Sie sich mit LINQ-to-SQL oder Entity Framework beschäftigen.


Geändert in Bezug auf den Kommentar:

Normale TSQL-Befehle sind schön und gut, aber Sie fragen nach dem Unterschied... der größte ist, dass LINQ-to-SQL die gesamte DAL für Sie bereitstellt, was eine enorme Zeitersparnis bedeutet und außerdem eine viel größere Sicherheit bei der Kompilierung ermöglicht. Aber es erlaubt Ihnen auch, den gleichen Ansatz zu verwenden, um Ihre lokalen Objekte und Ihre Datenbank zu betrachten - zum Beispiel ist das folgende gültig C# 3.0 (außer für [someDataSource], siehe unten):

var qry = from row in [someDataSource]
          group row by row.Category into grp
          select new {Category = grp.Key, Count = grp.Count(),
              TotalValue = grp.Sum(x=>x.Value) };

foreach(var x in qry) {
    Console.WriteLine("{0}, {1}, {2}", x.Category, x.Count, x.TotalValue);
}

Wenn es sich bei [someDataSource] um lokale Daten handelt, z. B. um eine List<T> Wenn es sich jedoch um einen LINQ-to-SQL-Datenkontext handelt, kann es das entsprechende TSQL auf dem Datenbankserver erstellen. Dies macht es möglich, einen einzigen Abfragemechanismus in Ihrem Code zu verwenden (innerhalb der Grenzen von LOLA natürlich).

1voto

MusiGenesis Punkte 72729

Gruppierung, Filterung und Aggregation sollten Sie besser Ihrer Datenbank überlassen. DataTables sind eigentlich relativ gut in solchen Dingen (ihr schlechter Ruf scheint vor allem von unsachgemäßer Verwendung zu kommen), aber nicht so gut wie eine echte Datenbank. Außerdem, ohne eine lote der Arbeit auf Ihrem Teil, würde ich mein Geld auf die DataTable's mit besserer Leistung als Ihre hausgemachte Datenstruktur setzen.

0voto

Frans Bouma Punkte 8141

Warum nicht eine lokale Datenbank wie Sqlserver CE oder firebird embedded verwenden? (oder sogar MS Access! :)). Speichern Sie die Daten in der lokalen Datenbank, führen Sie die Verarbeitung mit einfachen Sql-Abfragen durch und holen Sie die Daten zurück. Das ist viel einfacher und wahrscheinlich mit weniger Aufwand verbunden. Außerdem müssen Sie nicht die gesamte Logik für Gruppierungen/Aggregate usw. schreiben, da die Datenbanksysteme diese Logik bereits eingebaut haben und fehlerfrei funktionieren.

0voto

Giovanni Galbo Punkte 12811

Ja, Sie können LINQ verwenden, um all diese Dinge mit Ihren benutzerdefinierten Objekten zu tun.

Und ich habe bemerkt, dass viele Leute vorschlagen, diese Art von Dingen in der Datenbank zu tun... aber Sie haben nie angegeben, woher die Datenbank kommt.

Wenn die Daten です aus der Datenbank kommen, dann sollte zumindest die Filterung wahrscheinlich dort stattfinden, es sei denn, Sie machen etwas Spezielles (z.B. arbeiten mit einem zwischengespeicherten Datensatz). Und selbst dann, wenn Sie mit einer beträchtlichen Menge an zwischengespeicherten Daten arbeiten, könnten Sie gut daran tun, diese Daten in eine eingebettete Datenbank wie SQLite zu legen, wie bereits jemand anderes erwähnt hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X