2010-08-06 17 views
5

w regulaminowym SQL mogę zrobić coś takiegoGrupa przez tydzień roku (liczba Tydzień) w LINQ do SQL

SELECT * From T GROUP BY DATEPART(wk, T.Date) 

Jak mogę to zrobić w LINQ do SQL?

Poniższa nie działają

From F In DB.T Group R By DatePart(DateInterval.WeekOfYear, F.Date) 

również nie działają:

From F In DB.T Group R By (F.Date.DayOfYear/7) 
+0

Kiedy mówisz, że to nie działa, co masz na myśli? Nie kompiluje, nie zwraca oczekiwanych wyników? – sgriffinusa

+0

nie kompiluje ... "Nazwę zmiennej zakresu można wywnioskować tylko z prostej lub kwalifikowanej nazwy bez argumentów." – ariel

+0

OK, odpowiedź brzmi: "Od F W DB.T Grupa R Wg WeekOfYear = (F.DateOfYear/7)" – ariel

Odpowiedz

0

ta działa poprawnie.

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

Podałeś grupę niepoprawnie. Wynikiem tego kodu jest zbiór obiektów. Każdy obiekt będzie miał właściwość klucz, który będzie co spis (w tym przypadku wynik F.Date.DayOfYear/7. Każdy obiekt będzie zbiorem obiektów z T, które spełniały warunek grupy.

+0

wszystko, co musiałem zrobić, to "Od F W DB.T Grupa R W WeekOfYear = (F. Date.DayOfYear/7) ";) – ariel

0

Jeśli są zaniepokojeni kultury jesteś w poniższym kodzie weźmie to pod uwagę.

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

to nie działa-- "Metoda" Int32 GetWeekOfYear (System.DateTime, System.Globalization.CalendarWeekRule, System.DayOfWeek) "nie ma obsługiwanego tłumaczenia na SQL." – ariel

+0

Wygląda na to, że Calendar.GetWeekOfYear nie jest wspierany w Linq2Sql lub Linq dla Entities; musisz najpierw wyciągnąć wszystkie dane, a następnie użyć polecenia cal.GetWeekOfYear (x, rule, firstDayOfWeek). –

+0

tak ..ale podzielenie DayOfYear przez 7 jest wystarczające dla moich potrzeb. dzięki! – ariel

7

LINQ to SQL nie obsługuje metodę Calendar.WeekOfYear, ale mogą potencjalnie stworzyć TSQL function that wraps the call to DatePart DAYOFYEAR/7 trik powinien pracować dla większości przypadki i jest m uch łatwiejszy w użyciu. Oto kod I skończył z:

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

Wyniki w coś takiego:

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

Pamiętaj tylko, że nie będzie to bezpośrednio odpowiadać kalendarzowym tygodniom, ponieważ zakłada, że ​​rok zaczyna się zawsze w niedzielę. Aby w pełni się dopasować, musisz użyć funkcji Calendar.WeekOfYear lub zawrzeć wywołanie DatePart w funkcji SQL –

0

Najpierw należy uzyskać datę pierwszego dnia tygodnia.

Aby uzyskać datę pierwszego dnia tygodnia. można użyć tego kodu:

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

Następnie można grupować według pierwszego dnia tygodnia.

Więc ten kod w regularnych SQL:

SELECT * From T GROUP BY DATEPART(wk, T.Date) 

można zrobić w LINQ do SQL jak ten

T.GroupBy(i => i.Date.StartOfWeek(DayOfWeek.Monday));