在常规的SQL我可以做类似按周年(周数)中的LINQ to SQL
SELECT * From T GROUP BY DATEPART(wk, T.Date)
我如何能做到这一点的LINQ to SQL的?
下不工作
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)
在常规的SQL我可以做类似按周年(周数)中的LINQ to SQL
SELECT * From T GROUP BY DATEPART(wk, T.Date)
我如何能做到这一点的LINQ to SQL的?
下不工作
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)
。谢谢 – ariel 2010-08-06 21:51:12
这正常工作。
from F in DB.T group F by F.Date.DayOfYear/7;
您错误地指定了组。此代码的结果是对象的集合。每个对象有哪些会是什么您的F.Date.DayOfYear/7
结果进行分组(在这种情况下,一个关键属性。每个对象都将在T能够满足该组条件的对象的集合。
我所要做的只是“从F到DB.T Group R By WeekOfYear =(F. Date.DayOfYear/7)“;) – ariel 2010-08-06 21:50:03
如果您关心的文化,你是在下面的代码会考虑到这一点:
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;
这不工作 - “方法”Int32 GetWeekOfYear(System.DateTime,System.Globalization.CalendarWeekRule,System.DayOfWeek)'没有支持转换为SQL。“ – ariel 2010-08-06 21:45:24
似乎Calendar.GetWeekOfYear不支持Linq2Sql或Linq to Entities;您将首先获取整个数据,然后使用cal.GetWeekOfYear(x,rule,firstDayOfWeek)。 – 2010-08-06 22:02:25
是的..但将DayOfYear除以7就足够满足我的需求。谢谢! – ariel 2010-08-06 22:09:53
LINQ to SQL不支持Calendar.WeekOfYear方法,但你可能会创建一个TSQL function that wraps the call to DatePart的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
请记住,这不会直接对应于日历周,因为它假设年度始终在星期日开始。要完全匹配,您需要使用Calendar.WeekOfYear或将DatePart调用包装到SQL函数中 – 2010-08-06 22:24:25
首先你应该在一周的第一天的日期。
获取本周第一天的日期。 您可以使用此代码:
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;
}
}
那么你可以通过每周的第一天团。
所以这个代码在普通的SQL:
SELECT * From T GROUP BY DATEPART(wk, T.Date)
可以Linq中可以做这样的SQL
T.GroupBy(i => i.Date.StartOfWeek(DayOfWeek.Monday));
当你说这是行不通的,你是什么意思?不编译,不返回预期的结果? – sgriffinusa 2010-08-06 21:25:58
doesnt compile ..“范围变量名称只能从一个没有参数的简单或限定名称推断出来。” – ariel 2010-08-06 21:27:02
好的,答案是“From F In DB.T Group R By WeekOfYear =(F.Date.DayOfYear/7)” – ariel 2010-08-06 21:59:35