Ausgabe
Ich versuche, die Stunden, die unter der Woche anfallen, anders zu berechnen als die, die am Wochenende gearbeitet werden. So hatte ich gehofft, es zu erreichen:
private void SetTotalCharge()
{
int.TryParse(MDate.ToString("MM"), out int month);
int.TryParse(MDate.ToString("yyyy"), out int year);
TotalCharge =
Decimal.Round(Convert.ToDecimal(db.MyTable
.Where(a => a.Date <= MDate & a.Date.Month == MDate.Month & (a.Date.Year) == year & (a.Date.DayOfWeek != DayOfWeek.Saturday && a.Date.DayOfWeek != DayOfWeek.Sunday))
.Select(a => a.RepairHours).Sum() * RateWeek
+ db.MyTable
.Where(a => a.Date <= MDate & a.Date.Month == MDate.Month & (a.Date.Year) == year & (a.Date.DayOfWeek == DayOfWeek.Saturday && a.Date.DayOfWeek == DayOfWeek.Sunday))
.Select(a => a.RepairHours).Sum() * RateWeekend), 2, MidpointRounding.AwayFromZero);
}
Der Fehler, den ich bekomme:
System.NotSupportedException: "The specified type member 'DayOfWeek' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."
Wie kann ich das umgehen?
Lösung
Die DayOfWeek
Aufzählung ist auf der Serverseite nicht vorhanden, was die Hauptursache für die Ausnahme ist. Im Folgenden finden Sie zwei Workarounds zur Lösung des Problems. Die erste verwendet eine Liste von Wochentagsordnungszahlen (0 und 6), und die zweite prüft die Ordnungszahlen direkt in der Bedingung (analog zu Ihrem ursprünglichen Ansatz).
Die folgenden Beispiele funktionieren für Entity Framework. Führen Sie für die Unterstützung von EFCore ein Suchen und Ersetzen mit DbFunctions.DiffDays
und EF.Functions.DateDiffDay
als den jeweiligen Kriterien durch.
private void SetTotalCharge()
{
var dateTime = new DateTime(1899, 12, 31);
var weekends = new List<int>{ 0, 6 };
int.TryParse(MDate.ToString("MM"), out int month);
int.TryParse(MDate.ToString("yyyy"), out int year);
TotalCharge =
Decimal.Round(Convert.ToDecimal(db.MyTable
.Where(a => a.Date <= MDate & a.Date.Month == MDate.Month & (a.Date.Year) == year & !weekends.Any(r => r == DbFunctions.DiffDays(dateTime, a.Updated) % 7))
.Select(a => a.RepairHours).Sum() * RateWeek
+ db.MyTable
.Where(a => a.Date <= MDate & a.Date.Month == MDate.Month & (a.Date.Year) == year & weekends.Any(r => r == DbFunctions.DiffDays(dateTime, a.Updated) % 7))
.Select(a => a.RepairHours).Sum() * RateWeekend), 2, MidpointRounding.AwayFromZero);
}
Oder
private void SetTotalCharge()
{
var dateTime = new DateTime(1899, 12, 31);
int.TryParse(MDate.ToString("MM"), out int month);
int.TryParse(MDate.ToString("yyyy"), out int year);
TotalCharge =
Decimal.Round(Convert.ToDecimal(db.MyTable
.Where(a => a.Date <= MDate & a.Date.Month == MDate.Month & (a.Date.Year) == year & ((DbFunctions.DiffDays(dateTime, a.Date) % 7) != 0 && (DbFunctions.DiffDays(dateTime, a.Date) % 7) != 6))
.Select(a => a.RepairHours).Sum() * RateWeek
+ db.MyTable
.Where(a => a.Date <= MDate & a.Date.Month == MDate.Month & (a.Date.Year) == year & ((DbFunctions.DiffDays(dateTime, a.Date) % 7) == 0 || (DbFunctions.DiffDays(dateTime, a.Date) % 7) == 6))
.Select(a => a.RepairHours).Sum() * RateWeekend), 2, MidpointRounding.AwayFromZero);
}
Beantwortet von – Adam Cohen
Antwort geprüft von – Jay B. (FixError Admin)