2010-08-06 75 views
5

在常规的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) 
+0

当你说这是行不通的,你是什么意思?不编译,不返回预期的结果? – sgriffinusa 2010-08-06 21:25:58

+0

doesnt compile ..“范围变量名称只能从一个没有参数的简单或限定名称推断出来。” – ariel 2010-08-06 21:27:02

+0

好的,答案是“From F In DB.T Group R By WeekOfYear =(F.Date.DayOfYear/7)” – ariel 2010-08-06 21:59:35

回答

0

这正常工作。

from F in DB.T group F by F.Date.DayOfYear/7; 

您错误地指定了组。此代码的结果是对象的集合。每个对象有哪些会是什么您的F.Date.DayOfYear/7结果进行分组(在这种情况下,一个关键属性。每个对象都将在T能够满足该组条件的对象的集合。

+0

我所要做的只是“从F到DB.T Group R By WeekOfYear =(F. Date.DayOfYear/7)“;) – ariel 2010-08-06 21:50:03

0

如果您关心的文化,你是在下面的代码会考虑到这一点:

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; 
+0

这不工作 - “方法”Int32 GetWeekOfYear(System.DateTime,System.Globalization.CalendarWeekRule,System.DayOfWeek)'没有支持转换为SQL。“ – ariel 2010-08-06 21:45:24

+0

似乎Calendar.GetWeekOfYear不支持Linq2Sql或Linq to Entities;您将首先获取整个数据,然后使用cal.GetWeekOfYear(x,rule,firstDayOfWeek)。 – 2010-08-06 22:02:25

+0

是的..但将DayOfYear除以7就足够满足我的需求。谢谢! – ariel 2010-08-06 22:09:53

7

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 
+2

请记住,这不会直接对应于日历周,因为它假设年度始终在星期日开始。要完全匹配,您需要使用Calendar.WeekOfYear或将DatePart调用包装到SQL函数中 – 2010-08-06 22:24:25

0

首先你应该在一周的第一天的日期。

获取本周第一天的日期。 您可以使用此代码:

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));