2010-08-06 16 views
5

En SQL normal que podría hacer algo comoGrupo de semana del año (Número de la semana) en LINQ to SQL

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

¿Cómo puedo hacer que en LINQ to SQL?

La siguiente no funcionan

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

tampoco funcionan:

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

Cuando dice que no funciona, ¿qué quiere decir? No compila, ¿no devuelve los resultados esperados? – sgriffinusa

+0

no compila ... "El nombre de la variable de rango solo puede inferirse a partir de un nombre simple o calificado sin argumentos." – ariel

+0

bien, la respuesta es "De F En DB.T Grupo R Por WeekOfYear = (F.Date.DayOfYear/7)" – ariel

Respuesta

0

Esto funciona correctamente.

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

Usted estaba especificando el grupo incorrectamente. El resultado de este código es una colección de objetos. Cada objeto tendrá una propiedad de claves que será lo que agrupó por (en este caso el resultado de F.Date.DayOfYear/7. Cada objeto será una colección de objetos de T que cumplen la condición de grupo.

+0

todo lo que tuve que hacer fue "De F En DB.T Grupo R Por WeekOfYear = (F. Date.DayOfYear/7) ";) – ariel

0

Si está preocupado por la cultura se encuentra en el siguiente código tendrá eso en cuenta:.

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

esto no funciona-- "Método 'Int32 GetWeekOfYear (System.DateTime, System.Globalization.CalendarWeekRule, System.DayOfWeek)' no tiene traducción soportada a SQL." – ariel

+0

Parece que Calendar.GetWeekOfYear no es compatible en Linq2Sql o Linq con entidades; Tendría que extraer todo el conjunto de datos primero y luego usar cal.GetWeekOfYear (x, rule, firstDayOfWeek). –

+0

sí ...pero dividir DayOfYear por 7 es suficiente para mis necesidades. ¡Gracias! – ariel

7

LINQ to SQL no es compatible con el método Calendar.WeekOfYear, pero potencialmente podría crear un TSQL function that wraps the call to DatePart el truco DiaDelAnio/7 debería funcionar para la mayoría casos y es m uch más fácil de usar. Aquí está el código que terminó 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() 
     }; 

Resultados en algo como esto:

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

Recuerde que esto no corresponderá directamente con las semanas del calendario, ya que supone que el año siempre comienza el domingo. Para que coincida completamente, deberá usar Calendar.WeekOfYear o ajustar la llamada DatePart en una función SQL –

0

En primer lugar usted debe conseguir la fecha del primer día de la semana.

Para obtener la fecha del primer día de la semana. puede utilizar este código:

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

Luego se pueden agrupar por la primera fecha de la semana.

Así que este código en SQL normal:

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

se puede hacer en LINQ to SQL como esto

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