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