2016-05-21 14 views
0

Ich verwende LINQ, um eine Liste von Objekten zu erhalten, die sich in einem bestimmten Datumsbereich befinden. Zum Beispiel habe ich aktuellen Tag im DateTime-Format: 21.05.2016 0:00:00 und ich brauche Nachrichten, die nach 1 Tag (vor 5 Tagen, vor 3 Monaten, vor 1 Jahr, 5 Jahren) und veröffentlicht wurden bis zu diesem Moment. Ich habe es den folowing Weg:Wie kann ich eine universelle Abfrage für den Datumsbereich durchführen?

List<MyObject> data = 
    DataDownloader.myList.Where(s => s.Date.Year >= fromDate.Year 
            && s.Date.Month >= fromDate.Month 
            && s.Date.Day >= fromDate.Day 
            && s.Date.Year <= toDate.Year 
            && s.Date.Month <= toDate.Month 
            && s.Date.Day <= toDate.Day).ToList(); 

toDate mein aktuelles Datum. Ich finde die VonDatum durch die folgenden:

1 Tag:

fromDate = toDate; 

5 Tagen

fromDate = toDate.AddDays(-5); 

3 Monate:

fromDate = toDate.AddMonths(-3); 

usw.

Aber ich bekomme nur 2 Nachrichten für 3 Monate. Es ist 21.04.2016 0:00:00 und 21.05.2016 0:00:00. Sie wissen also, dass sie sich nur in der Anzahl der Monate unterscheiden, da mein aktuelles Datum der 21.05.2016 ist. Was mache ich falsch? Ich sollte viel mehr Nachrichten bekommen, ich weiß es.

+2

Warum abfragen Sie jede Komponente einzeln und nicht nur 's.Date> = fromDate' etc? –

Antwort

2

Sie vergleichen jedes der Elemente eines Datums, was Ihnen nicht die richtige Antwort geben wird.

Sie sagen für die "letzten 3 Monate" (vom 21/02/2016 bis 21/05/2016), dass der Tag zwischen 21 und 21, der Monat zwischen 2 und 5 und das Jahr dazwischen liegen muss 2016 und 2016

Sie suchen effektiv nach 21/02/2016, 21/03/2016, 21/04/16 oder 21/05/2016 statt alle Daten zwischen.

vergleichen einfach das Datum:

list.Where(x => x.Date >= fromDate && x.Date <= toDate).ToList(); 
Verwandte Themen