[FIXED] Linq Summe der Spaltenwerte ohne Wochenenden

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 DayOfWeekAufzä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.DiffDaysund EF.Functions.DateDiffDayals 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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like