C# Linq到实体组(按周数)
我正在使用ASP.NET v4.5和linq创建实体 我正在尝试使用下面的代码按周分组我的数据C# Linq到实体组(按周数),c#,asp.net,linq,entity-framework,linq-to-entities,C#,Asp.net,Linq,Entity Framework,Linq To Entities,我正在使用ASP.NET v4.5和linq创建实体 我正在尝试使用下面的代码按周分组我的数据 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.AddDays(-(int)i.DueDate.DayOfWeek));
然而,我得到了一个带有错误的“死亡黄屏”:
LINQ to Entities无法识别方法“System.DateTime AddDays(Double)”方法,并且无法将此方法转换为存储表达式 理想情况下,我想把
var groupedByWeek = salesOrdersList.GroupBy(i => i.DueDate.WeekNumber);
但生活并不是那么容易
有人知道如何将周数与Linq to实体一起使用吗?使用方法:
它将把
DATEPART
sql函数调用添加到生成的sql查询中。或者您可以获取一周中第一天的日期,然后按该日期分组
获取一周中第一天的日期。
您可以使用以下代码:
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 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 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();
它有什么问题?LINQ to Entities无法识别“System.DateTime AddDays(Double)”方法,并且无法将此方法转换为存储表达式。如果将其更改为
i=>i.DueDate-TimeSpan.FromDays(i.DueDayOfWeek)
或i=>i.DueDayOfWeek-new TimeSpan(i.DueDayOfWeek,0,0),会发生什么情况
?system.DayOfWeek不可分配给参数类型DoubleMeh。。。在这种情况下,请尝试Marcin的答案。嗯,我喜欢这个解决方案,但我得到了以下错误:r System.NotSupportedException:LINQ to Entities无法识别“System.DateTime StartOfWeek(System.DateTime,System.DayOfWeek)”方法,并且此方法无法转换为存储表达式。是的,您是对的。我认为解决这个问题的方法是使用SqlFunctions
比如@MarcinJuraszek的解决方案:var-groupedByWeek=saleorderslist.GroupBy(I=>SqlFunctions.DatePart(“week”,I.DueDate))代码>因为此函数可以转换为常规SQL代码SELECT*fromtgroupbydatepart(wk,T.Date)
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();