LINQ to Entities und DateDiff - Workaround

In “LINQ to Entities”-Queries können (im Gegensatz zu LINQ to SQL) leider keine aus Transact-SQL bekannt Befehle wie DateDiff verwendet werden. Dazu gibt es aber einen kleinen, feinen Workaround…

Beispiel: mittels eines Dropdowns soll der Zeitraum ausgewählt werden innerhalb dem eine Liste von Bestellungen angezeigt werden soll.

Dropdown
<asp:DropDownList ID=”ddRange” runat=”server” AutoPostBack=”True”>
<asp:ListItem Value=”today” Text=”Heute”></asp:ListItem>
<asp:ListItem Value=”yesterday” Text=”Gestern”></asp:ListItem>
<asp:ListItem Value=”thisweek” Text=”Aktuelle Woche”></asp:ListItem>
<asp:ListItem Value=”lastweek” Text=”Letzte Woche”></asp:ListItem>
<asp:ListItem Value=”thismonth” Text=”Aktueller Monat”></asp:ListItem>
<asp:ListItem Value=”lastmonth” Text=”Letzter Monat”></asp:ListItem>
<asp:ListItem Value=”all” Text=”Letzte 6 Monate”></asp:ListItem>
</asp:DropDownList>

public static List<Bestellung> GetBestellungen()
{
int offset = 0;
DateTime startDate;
DateTime endDate;
DateTime today = DateTime.Today;
DateTime now = DateTime.Now;

using (DataEntities de = new DataEntities())
{
switch (today.DayOfWeek)
{
case DayOfWeek.Monday:
offset = 0;
break;
case DayOfWeek.Tuesday:
offset = -1;
break;
case DayOfWeek.Wednesday:
offset = -2;
break;
case DayOfWeek.Thursday:
offset = -3;
break;
case DayOfWeek.Friday:
offset = -4;
break;
case DayOfWeek.Saturday:
offset = -5;
break;
case DayOfWeek.Sunday:
offset = -6;
break;
}

switch (ddRange.SelectedValue)
{
case “today”:
startDate = today;
endDate = now;
break;
case “yesterday”:
startDate = today.AddDays(-1);
endDate = today;
break;
case “thisweek”:
startDate = today.AddDays(-offset);
endDate = now;
break;
case “lastweek”:
startDate = today.AddDays(-(7 + offset));
endDate = today.AddDays(-offset);
break;
case “thismonth”:
startDate = new DateTime(today.Year, today.Month, 1);
endDate = now;
break;
case “lastmonth”:
startDate = new DateTime(today.AddMonths(-1).Year, today.AddMonths(-1).Month, 1);
endDate = new DateTime(today.AddMonths(-1).Year, today.AddMonths(-1).Month, DateTime.DaysInMonth(today.AddMonths(-1).Year, today.AddMonths(-1).Month));
break;
default:
startDate = today.AddMonths(-6);
endDate = now;
break;
}

IQueryable<Bestellung> bestellungen = from best in de.Bestellungen
where best.BestellDatum >= startDate && best.BestellDatum < endDate
select best;

return bestellungen.ToList();
}
}

Antwort schreiben