在常規的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