Announcement

Collapse
No announcement yet.

LINQ - Aggregate richtig ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • LINQ - Aggregate richtig ?

    Hallo!

    ich beschäfftige mich seit kurzem mit LINQ.
    Nun habe ich folgendes Problem.

    Meine Tabelle sieht so aus:

    Nr;Index;Ein;Aus
    10;1;20; 0
    10;2;2;1
    10;3;0;19
    10;4;0;2

    Ich möchte nun die Differenz bzw. den Rest (im Lager) berechnen. Sollte dann so aussehen

    Nr;Index;Ein;Aus;Lager
    10;1;20;0;20
    10;2;2;1;21
    10;3;0;19;2
    10;4;0;2;0

    Code:
                    var auslastung = (from x in _repository.CountedData
                                      group x by new { x.No, x.Index } into y
                                      select new
                                      {
                                          y.Key.No,
                                          y.Key.Index,
                                           Lager =
                                               (from z in y
                                                select z.Ein - z.Aus).Aggregate((b1, b2) => b1 + b2)
                                      });
    Leider macht die Aggregation nun folgendes:
    Die Diff (Lager) ist immer der gleiche Wert (halt über alles berechnet!)

    10;1;20;0;0
    10;2;2;1;0
    10;3;0;19;0
    10;4;0;2;0

    Wie kann ich mein "Wunsch-Objekt" erhalten?
    Im Prinzip müsste nach jeder Zeile der Wert von Diff (Lager) gespeichert werden (in der entsprechenden Variablen - hier Lager).

    Jemand einen Tipp?

    Vielen Dank,
    Tucca
    Zuletzt editiert von tucca; 27.06.2009, 19:44.

  • #2
    Hallo,

    es wäre für mich leichter gewesen wenn ich nicht zuerst die Rechenvorschritt herausfinden musste.

    [highlight=c#]
    var query =
    from item in list
    select new
    {
    Nr = item.Nr,
    Index = item.Index,
    Ein = item.Ein,
    Aus = item.Aus,
    Lager = (from item2 in list
    where item2.Index <= item.Index
    let diff2 = item2.Ein - item2.Aus
    select diff2
    ).Sum()
    };
    [/highlight]
    Sollte das gewünschte Ergebnis liefern.
    Dabei ist "list" meine "Datenbank".

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hi !

      Super vielen Dank für die schnelle Hilfe.

      Mache mich jetzt noch etwas an die Optimierung der Performance...


      Gruß,
      Tucca

      Comment


      • #4
        Optimierung der Performance
        Lass die "let"-Zeile weg und berechne die Differenz in der "select"-Zeile. Viel mehr ist nicht drin.

        Außer dass datenbankseitig die Indizes angepasst werden, etc..
        Wird diese Query öfters verwendet sie auch kompiliert werden um die Leistung zu verbessern -> siehe hierzu meinen Artikel.

        Mehr sollte wirklich nicht drin sein

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment

        Working...
        X