在LINQ声明中查看一周的第一天



我想检查当前输入日期是否与我在数据库中的时间戳相同。我通过查看约会的周数来做到这一点。

我正在尝试使用:

Calendar.GetWeekOfYear(DateTime, ...)

方法,正常工作。

但是,当我使用LINQ时,我会得到

An exception of type 'System.NotSupportedException' occurred in System.Data.Entity.dll but was not handled in user code
Additional information: LINQ to Entities [...]

我的代码:

 var ordersWeek = orders.Where(c => 
                (EntityFunctions.TruncateTime(c.Timestamp).Value.Year == EntityFunctions.TruncateTime(DateTime.Now).Value.Year) &&
                (EntityFunctions.TruncateTime(c.Timestamp).Value.StartOfWeek(DayOfWeek.Monday) == EntityFunctions.TruncateTime(DateTime.Now).Value.StartOfWeek(DayOfWeek.Monday))
                ).ToList();

在这个特定的代码中,我尝试使用这个扩展方法:

  public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        int diff = dt.DayOfWeek - startOfWeek;
        if (diff < 0)
        {
            diff += 7;
        }
        return dt.AddDays(-1 * diff);
    }

在LINQ中,最好的方法是什么?请记住,不能使用.Date函数。

您的扩展方法StartOfWeek对C#代码是可见的,实体框架无法转换为底层数据源语言(可能是SQL)。同样,如果你尝试使用Calendar.GetWeekOfYear,它会失败,原因与EF无法翻译它的原因相同。

相反,你可以做:

  • 计算一周的开始日期和结束日期
  • 使用该范围在LINQ查询中进行查询,如c.TimeStamp >= StartDate && c.TimeStamp <= EndDate

代码:

DateTime startDate = dt.StartOfWeek(DayOfWeek.Monday);
DateTime endDate = startDate.AddDays(6);

使用您的扩展方法:

public static class MyExtension
{
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        int diff = dt.DayOfWeek - startOfWeek;
        if (diff < 0)
        {
            diff += 7;
        }
        return dt.AddDays(-1*diff);
    }
}

然后在您的LINQ查询中:

var ordersWeek = orders.Where(c =>
                (EntityFunctions.TruncateTime(c.Timestamp).Value.Year == EntityFunctions.TruncateTime(DateTime.Now).Value.Year) &&
                (EntityFunctions.TruncateTime(c.Timestamp).Value >= startDate && 
                EntityFunctions.TruncateTime(c.Timestamp).Value <= endDate)
                .ToList();

最新更新