2013-02-22 9 views
6

I C# und LINQ verwendet, habe ich einige Date in Art DateWie bestelle ich Termine in Linq?

Ich verwende dieses Skript Im Moment aus dem früheren auf den aktuelle Liste nach dem Datum des Starts zu bestellen.

Mit dem folgenden Code sind meine Ereignisse nicht sortiert:

 events.OrderBy(x => x.DateTimeStart).ToList();  
     return events.AsQueryable(); 

Was hier falsch sein könnte?

+1

Denken Sie daran, dass 'AsQueryable()' und 'ToList()' in Abhängigkeit von der zugrunde liegenden Datenstruktur sehr unterschiedliche Dinge bedeuten. – flindeberg

Antwort

4

events.OrderBy(x => x.DateTimeStart): Deklarieren Sie eine Abfrage, die Ereignisse von Immobilien DateTimeStart sortiert. Die Abfrage wird noch nicht ausgeführt.

events.OrderBy(x => x.DateTimeStart).ToList();: Verarbeitet die vorherige Abfrage. Iterate durch alle Ereignisse, überprüft ihre DateTimeStart, sortiere sie und sichere Ergebnis als Liste und dann ... verwerfen das Ergebnis! Weil du es nicht sicher hast. Vergleichen Sie es mit etwas wie folgt aus:

int a = 0; 
a + 1; 
b = a; // b is 0 

return events.AsQueryable();: Hier können Sie Ihre ursprünglichen Ereignisse zurückkehren statt sortiert.

Sie sollten Ihren Code schreiben, wie folgt:

return events.OrderBy(x => x.DateTimeStart).ToList().AsQueryable(); 

Diese Version statische Liste sortierter Ereignisse schaffen. Wenn Sie jetzt die Ereignisse Liste ändern, wird das Ergebnis Ihre Änderungen nicht berücksichtigen.

Die zweite Lösung ist:

return events.OrderBy(x => x.DateTimeStart).AsQueryable(); 

Diese Version keine Arbeit tun. Es deklariert nur eine Art zu sortieren Ereignisse und gibt diese Art und Weise als IQueryable zurück. Wenn Sie in zukünftigen Code zurückgegebenen Wert verwenden, wird es immer alle sortierten Ereignisse enthalten, auch wenn Sie vor der Verwendung neue hinzufügen.

12

events.OrderBy(x => x.DateTimeStart).ToList() erstellt eine neue Liste und Sie geben sie nicht zurück.

Sie wollen wahrscheinlich etwas wie

return events.OrderBy(x => x.DateTimeStart).ToList(); 
+0

Vielen Dank für Ihre Antworten! – GibboK

2

Laden Sie Ihre orderedevents in einer Variablen und senden Sie diese Variable AsQueryable();

var orderedEvents = events.OrderBy(x => x.DateTimeStart).ToList();  

return orderedEvents.AsQueryable(); 

oder wenn Sie diese Variable nicht benötigen, senden Sie Ihre bestellten Ereignisse direkt zurück.

return events.OrderBy(x => x.DateTimeStart).ToList().AsQueryable(); 
+0

erwähnenswert, dass ToList() den LINQ-Ausdruck auswerten und das Ergebnis speichern wird. Danach ist ein Zurückgeben eines IQueryable über diese Liste nicht sinnvoll. – publicgk

+0

ja du hast Recht. Ich stelle nur seinen aktualisierten Code zur Verfügung.Ich weiß nicht, warum er es alsQueryable() zurückgibt; – Jehof

+1

vielleicht was er wollte, ist etwas wie: 'return events.OrderBy (x => x.DateTimeStart) .AsQueryable();' – publicgk

Verwandte Themen