C# 在Linq to SQL中按周分组(周数)
在常规SQL中,我可以执行以下操作C# 在Linq to SQL中按周分组(周数),c#,sql-server,vb.net,linq-to-sql,week-number,C#,Sql Server,Vb.net,Linq To Sql,Week Number,在常规SQL中,我可以执行以下操作 SELECT * From T GROUP BY DATEPART(wk, T.Date) 在LINQtoSQL中如何实现这一点 下面的方法不起作用 From F In DB.T Group R By DatePart(DateInterval.WeekOfYear, F.Date) 也不起作用: From F In DB.T Group R By (F.Date.DayOfYear / 7) 这是正确的 from F in DB.T group F b
SELECT * From T GROUP BY DATEPART(wk, T.Date)
在LINQtoSQL中如何实现这一点
下面的方法不起作用
From F In DB.T Group R By DatePart(DateInterval.WeekOfYear, F.Date)
也不起作用:
From F In DB.T Group R By (F.Date.DayOfYear / 7)
这是正确的
from F in DB.T group F by F.Date.DayOfYear / 7;
您不正确地指定了组。此代码的结果是对象的集合。每个对象都有一个键属性,该属性是您分组的依据(在本例中为
F.Date.DayOfYear/7
。每个对象都是T中满足分组条件的对象的集合。如果您关心区域性,则在以下代码中您将考虑到这一点:
var ci = CultureInfo.CurrentCulture;
var cal = ci.Calendar;
var rule = ci.DateTimeFormat.CalendarWeekRule;
var firstDayOfWeek = ci.DateTimeFormat.FirstDayOfWeek;
var groups = from F in DB.T
group F by cal.GetWeekOfYear(F, rule, firstDayOfWeek) into R
select R;
不支持该方法,但您可能会创建一个TSQL。DayOfYear/7技巧应该适用于大多数情况,并且更易于使用。下面是我最后得到的代码:
var x = from F in DB.T
group F by new {Year = F.Date.Year, Week = Math.Floor((decimal)F.Date.DayOfYear / 7)} into FGroup
orderby FGroup.Key.Year, FGroup.Key.Week
select new {
Year = FGroup.Key.Year,
Week = FGroup.Key.Week,
Count = FGroup.Count()
};
结果如下:
Year Week Count
2004 46 3
2004 47 3
2004 48 3
2004 49 3
2004 50 2
2005 0 1
2005 1 8
2005 2 3
2005 3 1
2005 12 2
2005 13 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;
}
}
可以像这样在LINQtoSQL中完成
T.GroupBy(i => i.Date.StartOfWeek(DayOfWeek.Monday));
您可以使用命名空间中的
SqlFunctions.DatePart
方法
// Return the week number
From F In DB.T Group R By SqlFunctions.DatePart("week", F.Date)
当你说它不起作用时,你是什么意思?不编译,不返回预期的结果?不编译..“范围变量名只能从没有参数的简单或限定名中推断出来。”好的,答案是“从DB.t组R中的F按WeekOfYear=(F.Date.DayOfYear/7)”这不起作用--“方法”Int32 GetWeekOfYear(System.DateTime,System.Globalization.CalendarWeekRule,System.DayOfWeek)“不支持转换为SQL”。在Linq2Sql或Linq to实体中,似乎不支持Calendar.GetWeekOfYear;您应该先提取设置的整个数据,然后使用cal.GetWeekOfYear(x,rule,firstDayOfWeek).是的..但是将DayOfYear除以7就足够了。谢谢!我所要做的就是“从DB.T组R中的F除以WeekOfYear=(F.Date.DayOfYear/7)”;)请记住,这不会直接对应于日历周,因为它假设一年总是从星期日开始。要完全匹配,您需要使用Calendar.WeekOfYear或将DatePart调用包装到SQL函数中
// Return the week number
From F In DB.T Group R By SqlFunctions.DatePart("week", F.Date)