C# 检查LINQ声明中的每周第一天
我想检查当前输入日期是否与数据库中的时间戳相同。我通过查看日期的周数来实现这一点 我正在尝试使用:C# 检查LINQ声明中的每周第一天,c#,linq-to-entities,C#,Linq To Entities,我想检查当前输入日期是否与数据库中的时间戳相同。我通过查看日期的周数来实现这一点 我正在尝试使用: Calendar.GetWeekOfYear(DateTime, ...) 方法,该方法通常有效 但是,当我使用LINQ时,我得到了: An exception of type 'System.NotSupportedException' occurred in System.Data.Entity.dll but was not handled in user code Additional
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);
}
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);
}
}
public static DateTime StartOfWeek(此DateTime dt,DayOfWeek StartOfWeek)
{
int diff=dt.DayOfWeek-startOfWeek;
如果(差异<0)
{
diff+=7;
}
返回dt.AddDays(-1*diff);
}
在LINQ中实现这一点的最佳方法是什么?请记住,您不能使用
.Date
函数。您的扩展方法StartOfWeek
仅对您的C代码可见,实体框架无法转换为基础数据源语言(可能是SQL)。同样,如果您尝试使用,它将失败,原因与EF无法翻译它的原因相同
相反,您可以:
- 计算一周的开始日期和结束日期
- 使用该范围在LINQ查询中进行查询,如
c.TimeStamp>=StartDate&&c.TimeStamp (EntityFunctions.TruncateTime(c.Timestamp).Value.Year==EntityFunctions.TruncateTime(DateTime.Now).Value.Year)&& (EntityFunctions.TruncateTime(c.Timestamp).Value>=startDate&&
EntityFunctions.TruncateTime(c.Timestamp).Value LINQ to Entities与LINQ to Object相比是非常有限的。请发布整个LINQ表达式。如果使用LINQ to Entities,这就是它失败的原因。没有支持的方法将该方法转换为sql。请尝试在sql之外使用该方法,然后在其上加入。如果没有LINQ,您将如何在sql中编写它?请对此进行分析首先找出,然后找出如何将其映射到LINQ。@丹尼斯我添加了代码我想您必须根据C#End的输入日期计算周开始日期和结束日期,然后在LINQ查询中使用该日期范围进行比较,如C.TimeStamp>=StartDate&&C.TimeStamp这似乎有问题……扩展名的签名遇到了问题hod应该有“this DateTime dt”。或者至少,我必须这样做才能使它在我的解决方案中发挥作用。否则,回答得很好。@SailingJudo,你是绝对正确的,不知为什么我错过了它,请以后自由编辑自己,谢谢你指出它。
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); } }
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();