Erhalten Sie die beste Leistung von Entity Framework 6 wie Dapper.NET

c# crud dapper entity-framework performance

Frage

Ich habe dapper.net als Mikro-Orm verwendet, Geschwindigkeit und Leistung sind fantastisch!

Einfache CRUD-Vorgänge in Dapper sind schneller als Entity Framework 6.

Speed-Comparison-Dapper-vs-Entity-Framework

Aber wenn ich Geschwindigkeit und Leistung von Entity Framework 6 wie Dapper will, was soll ich tun?

Ich brauche also nicht alle erweiterten Funktionen von Entity Framework 6

Kann ich einige Funktionen deaktivieren, um die Geschwindigkeit und Leistung von Entity Framework 6 zu erhöhen? Welcher ?

Welche Funktionen sind teuer und erhöhen die Geschwindigkeit, um sie zu deaktivieren? (Bitte angeben)

Akzeptierte Antwort

Beginnen Sie mit einem Profil der SQL-Befehle, die vom Entity Framework tatsächlich ausgegeben wurden. Abhängig von Ihrer Konfiguration (POCO, Self-Tracking-Entitäten) gibt es viel Raum für Optimierungen. Sie können die SQL-Befehle (die sich im Debug- und Freigabemodus nicht unterscheiden sollten) mit der ObjectSet<T>.ToTraceString() -Methode ObjectSet<T>.ToTraceString() . Wenn Sie auf eine Abfrage stoßen, die einer weiteren Optimierung bedarf, können Sie einige Projektionen verwenden, um EF weitere Informationen darüber zu geben, was Sie erreichen möchten.

Beispiel:

Product product = db.Products.SingleOrDefault(p => p.Id == 10);
// executes SELECT * FROM Products WHERE Id = 10

ProductDto dto = new ProductDto();
foreach (Category category in product.Categories)
// executes SELECT * FROM Categories WHERE ProductId = 10
{
    dto.Categories.Add(new CategoryDto { Name = category.Name });
}

Könnte ersetzt werden durch:

var query = from p in db.Products
            where p.Id == 10
            select new
            {
                p.Name,
                Categories = from c in p.Categories select c.Name
            };
ProductDto dto = new ProductDto();
foreach (var categoryName in query.Single().Categories)
// Executes SELECT p.Id, c.Name FROM Products as p, Categories as c WHERE p.Id = 10 AND p.Id = c.ProductId
{
    dto.Categories.Add(new CategoryDto { Name = categoryName });
}

Ich habe das nur aus meinem Kopf getippt, also ist das nicht genau so, wie es ausgeführt werden würde, aber EF macht einige nette Optimierungen, wenn Sie ihm alles sagen, was Sie über die Abfrage wissen (in diesem Fall benötigen wir die Kategorie- Namen). Dies ist jedoch nicht wie das Ladenlernen (db.Products.Include ("Categories")), da Projektionen die zu ladende Datenmenge weiter reduzieren können.


Beliebte Antwort

Tatsache ist, dass Produkte wie Entity Framework IMMER langsam und ineffizient sind, da sie viel mehr Code ausführen.

Ich finde es auch dumm, dass die Leute vorschlagen, LINQ-Abfragen zu optimieren, die erzeugte SQL zu betrachten, Debugger zu verwenden, vor dem Kompilieren zu arbeiten, viele zusätzliche Schritte zu unternehmen usw., dh viel Zeit zu verlieren. Niemand sagt - Vereinfachen Sie! Jeder möchte die Dinge weiter komplizieren, indem er noch mehr Schritte unternimmt (Zeitverschwendung).

Ein vernünftiger Ansatz wäre, EF oder LINQ überhaupt nicht zu verwenden. Verwenden Sie normales SQL. Daran ist nichts falsch. Nur weil unter Programmierern Herdenmentalität herrscht und sie den Drang verspüren, jedes neue Produkt da draußen zu verwenden, heißt das nicht, dass es gut ist oder funktionieren wird. Die meisten Programmierer denken, wenn sie jeden neuen Code einführen, der von einer großen Firma veröffentlicht wurde, werden sie zu einem intelligenteren Programmierer. überhaupt nicht wahr. Bei der intelligenten Programmierung geht es meistens darum, mit weniger Kopfschmerzen, Unsicherheiten und in kürzester Zeit mehr zu erreichen. Behalte die Zeit im Kopf! Dies ist das wichtigste Element. Versuchen Sie daher, Wege zu finden, um es nicht für das Lösen von Problemen in schlechtem / aufgeblähtem Code zu verschwenden, der einfach so geschrieben wurde, dass er mit einigen seltsamen sogenannten Mustern übereinstimmt.

Entspannen Sie sich, genießen Sie das Leben, machen Sie eine Pause vom Programmieren und hören Sie auf, zusätzliche Funktionen, Code, Produkte und Muster zu verwenden. Das Leben ist kurz und die Lebensdauer Ihres Codes ist noch kürzer, und es ist sicherlich keine Hexerei. Wenn Sie Ebenen wie LINQ, EF und andere entfernen, wird Ihr Code effizient ausgeführt, skaliert, und die Wartung bleibt trotzdem einfach. Zu viel Abstraktion ist ein schlechtes "Muster".

Und das ist die Lösung für Ihr Problem.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum