Forum: PC-Programmierung Linq, Spalten bei Group-By dazujoinen


von ent (Gast)


Lesenswert?

Hi,

ich stehe vor einen kleinen Problemchen...

ich habe in C# eine DataTable in welcher einige Daten eingefüllt sind. 
Hier mal ein einfacher aufbau

SpalteA; Datum; nochWas; nochWas
Wert1; 1; a; e
Wert2; 2; b; f
Wert1; 3; c; e
Wert3; 4; d; a

In Spalte A, Doppeln sich die Werte, diese möchte ich nach Datum 
ausgefiltert haben (neuester bleibt bestehen)
1
            DataTable td = data.AsEnumerable()
2
                .GroupBy(r => new {
3
                    SpalteA = r["SpalteA"]
4
                })
5
                .Select(g =>
6
                {
7
                    DataRow rw = data.NewRow();
8
9
                    rw["SpalteA"] = g.Key.SpalteA;
10
                    rw["Datum"] = g.Max(r => r.Field<DateTime>("Datum"));
11
                    ??? nochWas = selektiere["nochWas"] wenn Datum = g.Max(r => r.Field<DateTime>("Datum")) und SpalteA = g.Key.SpalteA
12
13
                    return rw;
14
                })
15
                .CopyToDataTable();

mein Ansatz funktioniert, ich bekomme nun meine Werte nicht mehr Doppelt 
und immer das neuste Datum.
Jetzt habe ich aber noch 2 Spalten in welchen die Daten nicht 
"weggruppiert" werden können, da sich diese Unterscheiden.
=> In SQL kann ich jetzt die Daten wieder "dazujoinen" welche sowohl 
SpalteA als auch dem Datum entsprechen, leider weiß ich nicht wie das 
mit Linq geht.

Vielen Dank

von Clemens L. (c_l)


Lesenswert?


von ent (Gast)


Lesenswert?

nun, entweder hab ichs jetzt zweimal überlesen...

Aber ich habe nicht das Problem einen GroupBy Ausdruck zu machen, 
sondern spalten dazuzujoinen welche nicht eindeutig sind.

von Clemens L. (c_l)


Lesenswert?

(SpalteA,Datum) ist eindeutig.

Aber der Join nur in SQL notwendig; in C# gibt dir GroupBy() eh alle 
Elemente der Gruppe zurück, aus denen du dann das Element mit dem 
größten Wert auswählen kannst:
1
var result = data.GroupBy(
2
    r => r.SpalteA,
3
    (key, elems) => elems.OrderByDescending(e => e.Datum).First()
4
);

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.