3 Stimmen

Caching Linq Query Frage

Ich erstelle ein Forum-Paket für ein CMS und Blick auf Zwischenspeichern einige der Abfragen, um mit Leistung zu helfen, aber ich bin nicht sicher, wenn Zwischenspeichern die unten helfen/zu tun, was es auf die unten sollte (BTW: Cachehelper ist eine einfache Helfer-Klasse, die nur hinzufügt und entfernt aus Cache)

          // Set cache variables
        IEnumerable<ForumTopic> maintopics;

        if (!CacheHelper.Get(topicCacheKey, out maintopics))
        {
            // Now get topics
            maintopics = from t in u.ForumTopics
                          where t.ParentNodeId == CurrentNode.Id
                          orderby t.ForumTopicLastPost descending
                          select t;
            // Add to cache
            CacheHelper.Add(maintopics, topicCacheKey);
        }
        //End Cache

        // Pass to my pager helper
        var pagedResults = new PaginatedList<ForumTopic>(maintopics, p ?? 0, Convert.ToInt32(Settings.ForumTopicsPerPage));

        // Now bind
        rptTopicList.DataSource = pagedResults;
        rptTopicList.DataBind();

Wird Linq nicht nur ausgeführt, wenn es aufgezählt wird? So die oben wird nicht funktionieren, wird es? als seine nur aufgezählt, wenn ich es an die Paging-Helper, die .Take() eine bestimmte Anzahl von Datensätzen auf der Grundlage eines Querystring Wert 'p' übergeben

2voto

marcind Punkte 52454

Sie müssen Ihre Ergebnisse aufzählen, zum Beispiel durch den Aufruf der ToList() méthode.

maintopics = from t in u.ForumTopics
             where t.ParentNodeId == CurrentNode.Id
             orderby t.ForumTopicLastPost descending
             select t;
// Add to cache
CacheHelper.Add(maintopics.ToList(), topicCacheKey);

0voto

Sean Punkte 788

Meine Erfahrung mit Linq-to-Sql ist, dass es nicht super performant ist, wenn man anfängt, sich mit komplexen Objekten und/oder Joins zu beschäftigen.

Der erste Schritt besteht darin, LoadOptions für den Datentext einzurichten. Dadurch werden Verknüpfungen erzwungen, so dass ein vollständiger Datensatz abgerufen wird. Dies war ein Problem in einem von mir geschriebenen Ticket-Tracking-System. Ich zeigte eine Liste von 10 Tickets an und sah, dass etwa 70 Abfragen über die Leitung kamen. Ich hatte Ticket->Substatus->Status. Aufgrund der verzögerten Initialisierung von L2S führte dies dazu, dass jeder Fremdschlüssel für jedes Objekt, auf das ich im Raster verwies, eine neue Abfrage auslöste. Hier ist ein Blogbeitrag (nicht meiner) zu diesem Thema (MSDN war schwach): http://oakleafblog.blogspot.com/2007/08/linq-to-sql-query-execution-with.html

Die nächste Möglichkeit besteht darin, vorkompilierte Linq-Abfragen zu erstellen. Ich musste dies bei großen Joins tun. Hier ist ein weiterer Blogbeitrag zu diesem Thema: http://aspguy.wordpress.com/2008/08/15/speed-up-linq-to-sql-with-compiled-linq-queries/

Die nächste Option ist die Umstellung auf gespeicherte Verfahren. Dies macht die Programmierung und Bereitstellung sicherlich schwieriger, aber für komplexe Abfragen, bei denen Sie nur eine Teilmenge von Daten benötigen, sind sie um Größenordnungen schneller.

Der Grund, warum ich das anspreche, ist, dass die Art und Weise, wie Sie über das Zwischenspeichern von Dingen sprechen (warum nicht den eingebauten Cache in ASP.NET verwenden?), Ihnen auf lange Sicht viel Kopfzerbrechen bereiten wird. Ich würde empfehlen, Ihr System aufzubauen und dann SQL-Traces auszuführen, um herauszufinden, wo Ihre Probleme mit der Datenbankleistung liegen, und dann Optimierungen darauf aufzubauen. Möglicherweise stellen Sie fest, dass Ihre wirklichen Probleme nicht in den "Top-10-Themen" liegen, sondern in anderen, viel einfacher zu behebenden Bereichen.

0voto

mfanto Punkte 13688

Ja, Sie müssen Ihre Ergebnisse aufzählen. Linq wertet Ihre Abfrage erst aus, wenn Sie die Ergebnisse aufgezählt haben.

Wenn Sie eine allgemeine Caching-Strategie für Linq suchen, finden Sie hier ein hervorragendes Tutorial:

http://petemontgomery.wordpress.com/2008/08/07/caching-the-results-of-linq-queries/

Das Endziel ist die Fähigkeit, automatisch eindeutige Cache-Schlüssel für jede Linq-Abfrage zu erzeugen.

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