提问人:Gordon Copestake 提问时间:4/12/2013 最后编辑:qujckGordon Copestake 更新时间:3/3/2020 访问量:8209
Linq to Entities 按周数分组
Linq to Entities group by week number
问:
我正在使用 ASP.NET v4.5 和 linq to entities 我正在尝试使用以下代码按周对我的数据进行分组
var groupedByWeek = salesOrdersList
.GroupBy(i => i.DueDate.AddDays(-(int)i.DueDate.DayOfWeek));
但是,我收到一个“黄屏死机”,并出现以下错误:
LINQ to Entities 无法识别方法“System.DateTime AddDays(Double)”方法,并且此方法无法转换为存储表达式。
理想情况下,我想把
var groupedByWeek = salesOrdersList.GroupBy(i => i.DueDate.WeekNumber);
但生活并没有那么容易!
有谁知道在 Linq to Entities 中使用周数的方法?
答:
19赞
MarcinJuraszek
4/12/2013
#1
使用 SqlFunctions.DatePart()
方法:
var groupedByWeek = salesOrdersList.GroupBy(i => SqlFunctions.DatePart("week", i.DueDate));
它将 sql 函数调用添加到生成的 SQL 查询中。DATEPART
1赞
hoss77
7/12/2017
#2
或者,您可以获取一周中第一天的日期,然后按该日期分组。
获取一周中第一天的日期。 您可以使用以下代码:
public static class DateTimeExtensions
{
public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
{
int diff = dt.DayOfWeek - startOfWeek;
if (diff < 0)
{
diff += 7;
}
return dt.AddDays(-1 * diff).Date;
}
}
然后,您可以按一周的第一个日期进行分组,如下所示:
var groupedByWeek = salesOrdersList.GroupBy(i => i.DueDate.StartOfWeek(DayOfWeek.Monday));
评论
0赞
Rodney
8/29/2017
嗯,我喜欢这个解决方案,但我得到这个错误:r System.NotSupportedException:LINQ to Entities 无法识别方法“System.DateTime StartOfWeek(System.DateTime, System.DayOfWeek)”方法,并且此方法无法转换为存储表达式。
0赞
hoss77
9/7/2017
是的,你是对的。我认为解决方案是使用 Like @MarcinJuraszek的解决方案:因为这个函数可以转换为这个常规的 SQL 代码SqlFunctions
var groupedByWeek = salesOrdersList.GroupBy(i => SqlFunctions.DatePart("week", i.DueDate));
SELECT * From T GROUP BY DATEPART(wk, T.Date)
2赞
Enver Yumrutas
3/3/2020
#3
每日:
var daily = salesOrdersList.Where(x => (long)(x.DueDate - new DateTime(1970, 1, 1, 0, 0, 0)).TotalDays == (long)(Datetime.Now.ToLocalTime()- new DateTime(1970, 1, 1, 0, 0, 0)).TotalDays ).ToList();
或
var daily = salesOrdersList.Where(x => x.DueDate.Day == Datetime.Now.ToLocalTime().Day).ToList();
每周:
var weekly = salesOrdersList.Where(x => (long)(x.DueDate - new DateTime(1970, 1, 1, 0, 0, 0)).TotalDays / 7 == (long)(Datetime.Now.ToLocalTime()- new DateTime(1970, 1, 1, 0, 0, 0)).TotalDays / 7).ToList();
每月
var monthly= salesOrdersList.Where(x => x.DueDate.Month== Datetime.Now.ToLocalTime().Month).ToList();
评论
i => i.DueDate - TimeSpan.FromDays(i.DueDate.DayOfWeek)
i => i.DueDate - new TimeSpan(i.DueDate.DayOfWeek, 0, 0, 0)