2010-08-06 21 views
5

In SQL regolare avrei potuto fare qualcosa di simileGruppo per Settimana dell'anno (numero Settimana) in LINQ to SQL

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

Come posso farlo in LINQ to SQL?

La seguente non funzionano

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

Inoltre non funzionano:

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

Quando si dice che non funziona, che cosa vuoi dire? Non si compila, non restituisce i risultati previsti? – sgriffinusa

+0

non viene compilato .. "Il nome della variabile di intervallo può essere dedotto solo da un nome semplice o qualificato senza argomenti." – ariel

+0

ok, la risposta è "From F In DB.T Group R By WeekOfYear = (F.Date.DayOfYear/7)" – ariel

risposta

0

Ciò funziona correttamente.

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

Si stava specificando il gruppo in modo errato. Il risultato di questo codice è una raccolta di oggetti. Ogni oggetto avrà una proprietà Key che sarà quello che raggruppati da (in questo caso il risultato di F.Date.DayOfYear/7. Ogni oggetto sarà una collezione di oggetti provenienti da T che ha incontrato la condizione del gruppo.

+0

tutto quello che dovevo fare era "From F In DB.T Group R By WeekOfYear = (F. Date.DayOfYear/7) ";) – ariel

0

Se preoccupati per la cultura si è nel codice seguente sarà tenerne conto:.

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

questo non funziona-- "Metodo 'Int32 GetWeekOfYear (System.DateTime, System.Globalization.CalendarWeekRule, System.DayOfWeek)' non ha traduzione supportata in SQL." – ariel

+0

Sembra che Calendar.GetWeekOfYear non sia supportato in Linq2Sql o Linq in Entities; avresti la possibilità di estrarre l'intero set di dati prima di utilizzare cal.GetWeekOfYear (x, rule, firstDayOfWeek). –

+0

si ..ma dividere DayOfYear per 7 è sufficiente per le mie esigenze. Grazie! – ariel

7

LINQ to SQL non supporta il metodo Calendar.WeekOfYear, ma si potrebbe creare un TSQL function that wraps the call to DatePart il DayOfYear/7 trucco dovrebbe funzionare per la maggior parte casi ed è m Più facile da usare. Ecco il codice ho finito con:

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

Risultati in qualcosa di simile:

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

Ricorda che questo non corrisponderà direttamente alle settimane del calendario, poiché presuppone che l'anno inizi sempre di domenica. Per abbinarlo completamente è necessario utilizzare Calendar.WeekOfYear o racchiudere la chiamata DatePart in una funzione SQL –

0

In primo luogo si dovrebbe ottenere la data del primo giorno della settimana.

Per ottenere la data del primo giorno della settimana. è possibile utilizzare questo codice:

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

Poi è possibile raggruppare per la prima data della settimana.

Quindi, questo codice in SQL regolare:

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

può essere fatto in LINQ to SQL come questo

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