LINQ Abfrage optimieren

  • C#

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Dksksm.

    LINQ Abfrage optimieren

    Hallo,

    ich habe eine List Of mit Angaben zu Debitoren. Eine der Angaben sind die Betriebsnummer für die der Debitor eine Datenschutzerklärung abgegeben hat.
    Das heißt ein Debitor kann NULL bis n mal in dieser Liste stehen. Auch die Betriebsnummern können mehrfach vorhandn sein für einen Debitoren.
    Das ist gegeben.
    Ich möchte bzw. muss für den gerade in Bearbeitung befindlichen Debitor eine Abfrage erstellen mit allen Betriebsnummer. Mehr wird nicht benötigt, die Betriebsnummern dürfen in diesem Ergebnis allerdings nicht mehr mehrfach auftreten.

    Ich habe folgendes geschrieben, was auch funktioniert.

    C#-Quellcode

    1. var itemList = (from t in Datenschutz
    2. where t.Debitor == Kundennummer
    3. select t);
    4. if (itemList.Count() > 0)
    5. {
    6. //Jeder Betrieb darf aber nur einmal vorkommen
    7. System.Collections.Generic.Dictionary<string, string> KeyList =
    8. new System.Collections.Generic.Dictionary<string, string>();
    9. foreach (DSEDaten item in itemList)
    10. {
    11. if (KeyList.ContainsKey(item.Betrieb) == false)
    12. {
    13. //Paranoia ...
    14. if (item.Betrieb != string.Empty)
    15. {
    16. _Betriebsnummern.Add(item.Betrieb);
    17. KeyList.Add(item.Betrieb, string.Empty);
    18. }
    19. }
    20. }
    21. }


    Mein Problem ist nur, dass die Routine seeeeeeehr langsam ist, was man bei mehrern hundertausend Datensätzen ungut zu spüren bekommt.
    Kann mir jemand die Lösung zeigen, wie ich mit einer Abfrage gleich das ganze Abfrageproblem erschlage und das möglichst auch spürbar schneller ist?

    Danke schon mal.

    RushDen schrieb:



    Dankeeeeeeee :)

    Ich brauch noch eine Weile das komplett umzusetzen, weil ich noch mehr umstricken muss. Der letzte Durchlauf mit meinen doch sehr großen Daten hat rund 8 Stunden gedauert.
    Ich berichte später das Ergebnis.
    ---------------
    Nachtrag: Es funktioniert zwar, aber sogar noch langsamer als zuvor. Schade.
    ---------------
    Nachtrag2: Nun exakt mit stopWatch gemessen, auf dem selben (lahmen) Rechner mit komplett identischen Daten. Beide Funktionen sind bei 1000 Datensätzen gleich schnell.
    Der Unterschied waren 13 Sekunden (voher 16 min 40.37 sek., nachher 16 min 27.00 sek.). Ob das an der Funktion oder am System liegt, weiß ich dann auch nicht.

    Hat jemand eine Idee wie man den Vorgang, evtl. ohne Linq, beschleunigen könnte?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Dksksm“ ()

    Ist ein Vergleich von Äpfel und Birnen, weil meine Zeitmessung sich nicht auf die Funktion bezieht sondern auf die Daten, die die in dieser Funktion erhobenen Daten verwenden sollen.
    Die Zeitmessung misst also an einer ganz anderen Stelle und ist auch nur eine Vergleichsgröße für mich.
    Die Liste "Datenschutz" umfasst 1,2 Millionen Dateninformationen, die sich aufgrund ihrer Herkunft auch nicht in einer Datenbank-Tabelle abbilden lassen. Die müssen sozusagen erst zu plausiblen Daten eingedampft werden.
    Ebenso ist der Code den ich benutze nur ein winziger Ausschnitt aus dem "Gesamtwerk", die LINQ-Abfrage selbst beherbergt auch noch weiter "where's".

    Meine Frage bleibt, gibt es eine Technik, die mir eine List Of <T> schneller durchsucht und auch ein identisches Ergebnis liefern kann, als es mit LINQ geht?

    VB1963 schrieb:

    Vt. kannst du damit die Geschwindigkeit optimieren...
    msdn.microsoft.com/de-de/library/dd460688(v=vs.100).aspx


    Und wie hilfreich das ist :)
    Ich kann noch nicht sagen wie viel schneller die Verarbeitung geht, jedenfalls idled mein Programm nicht mehr bei 25 Prozent Prozessorauslastung rum, sondern bringt den Notebookprozessor mit 96 Prozent schön zum "schwitzen". Man hört es also auch am Lüfter. Ich habe mal hochgerechnet, dass ich insgesamt im Programmablauf nur noch 60% der vorherigen Zeit benötige. Das wird sich dann aber konkret zeigen und sicher habe ich noch mehr Potential zum Optimieren in meinen Routinen.
    @VB1963 Herzlichen Dank :)