Laden...

Probleme mit Linq

Erstellt von michlG vor 15 Jahren Letzter Beitrag vor 15 Jahren 849 Views
michlG Themenstarter:in
3.430 Beiträge seit 2007
vor 15 Jahren
Probleme mit Linq

verwendetes Datenbanksystem: <Sql Express 2005>

Hallo zusammen,
ich habe ein kleines Problem mit Linq, wobei das Problem eher bei mir als bei Linq liegt =)

Ich habe ein Tabelle mit den folgenden Spalten (id, name, value, timestamp)
So, jetzt möchte ich über eine Abfrage immer den aktuellsten Wert von jedem Kanal (Name) kriegen.

Wenn ich also z.B. diese Daten habe
id - name - value - timestamp
1 - Test - 22 - 22.07.2008 11:11
2 - Test - 55 - 23.07.2008 12:12
3 - Test2 - 09 - 09.08.2008 14:12
4 - Test2 - 11 - 08.09.2008 23:23
5 - Test - 33 - 28.07.2008 20:20

Als Ergebnis möchte ich dann von jeden Namen nur den neuesten Wert kriegen.
Das Ergebnis bei diesem Beispiel wäre dann:
5 - Test - 33 - 28.07.2008 20:20
4 - Test2 - 11 - 08.09.2008 23:23

Habe da jetzt schon so einiges versucht, aber bin noch nicht ans Ziel gekommen:

                    var result = from row in ctx.daten_online_trend
                                     group row by row.name
                                     into grp
                                     select grp.First();

Vielen Dank für eure Hilfe 😉

Gruss
Michael

1.200 Beiträge seit 2007
vor 15 Jahren

Ich mach kein Linq, aber die max Funktionalität sollte dir weiterhelfen.

http://msdn.microsoft.com/en-us/vcsharp/aa336747.aspx#maxGrouped

Brauchst sicher sowas wie


//pseudo
from x in ctx.daten_online_trend
      group x by x.name into g
      select g.Group.Max(x => x.timestamp);

Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!

YARRRRRR!

michlG Themenstarter:in
3.430 Beiträge seit 2007
vor 15 Jahren

Hi,

danke.
Jetzt bin ich dem Ziel schon viel näher gekommen.

Ich habe das jetzt so umgeändert.

                    var result = from row in ctx.daten_online_trend
                                     group row by row.name.ToString()
                                     into grp
                                     select new { name = grp.Key, timestamp = grp.Max(row=>row.timestamp) };

Soweit passt alles. Ich bekomme den Namen und den Timestamp. Ich brauche aber auch den dazugehörigen Wert. Wie kann ich diesen rankommen?

Gruss
Michael

C
401 Beiträge seit 2007
vor 15 Jahren

 var result = from row in ctx.daten_online_trend
                                     group row by row.name.ToString()
                                     into grp
                                     select new { name = grp.Key, timestamp = grp.Max(row=>row.timestamp), value = grp.Value};


So sollte es doch gehen, oder nicht?

michlG Themenstarter:in
3.430 Beiträge seit 2007
vor 15 Jahren

Hi

So sollte es doch gehen, oder nicht?

Nö, das funzt nicht.

Gruss
Michael

1.200 Beiträge seit 2007
vor 15 Jahren

Probier mal, vielleicht klappts


var result = from row in ctx.daten_online_trend
group row by row.name.ToString()
into grp
from newest = grp.Max(row=>row.timestamp)
select grp.Where(row => row.timestamp == newest);

Ich kann das hier nicht testen, alles nur Vermutungen

Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!

YARRRRRR!

michlG Themenstarter:in
3.430 Beiträge seit 2007
vor 15 Jahren

Vielen Dank für eure Hilfe

Ich habe das Ganze jetzt so gelöst


                    var result = from row in ctx.daten_online_trend
                                     orderby row.timestamp descending 
                                     group row by row.name.ToString()
                                     into grp
                                     select grp.First();

Gruss
Michael