简体   繁体   English

LINQ 不包括周末的列值总和

[英]LINQ sum of column values excluding weekends

I'm trying to calculate the hours that fall during the week at a different rate than the ones worked during the weekend.我试图计算一周中的工作时间与周末工作的时间不同。 This is how I was hoping to accomplish it:这就是我希望实现它的方式:

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);
        }

The error I'm getting:我得到的错误:

System.NotSupportedException: "The specified type member 'DayOfWeek' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."

How can I get around this?我怎样才能解决这个问题?

The DayOfWeek enum does not exist on the server side.服务器端不存在 DayOfWeek 枚举。 Try this using the Contains or Any operator:尝试使用ContainsAny运算符:

Side note, I think your weekend predicate should be OR as opposed to AND: (a.Date.DayOfWeek == 0 || a.Date.DayOfWeek == 6) .旁注,我认为您的周末谓词应该是 OR 而不是 AND: (a.Date.DayOfWeek == 0 || a.Date.DayOfWeek == 6)


private void SetTotalCharge()
{
    var weekends = new[] {(int)DayOfWeek.Saturday, (int) DayOfWeek.Sunday}.ToArray();
    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.Contains(a.Date.DayOfWeek))
       .Select(a => a.RepairHours).Sum() * RateWeek
       + db.MyTable
       .Where(a => a.Date <= MDate & a.Date.Month == MDate.Month & (a.Date.Year) == year & weekends.Contains(a.Date.DayOfWeek))
       .Select(a => a.RepairHours).Sum() * RateWeekend), 2, MidpointRounding.AwayFromZero);
}

Or或者

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 != 0 && a.Date.DayOfWeek != 6))
       .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 == 0 || a.Date.DayOfWeek == 6))
       .Select(a => a.RepairHours).Sum() * RateWeekend), 2, MidpointRounding.AwayFromZero);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM