2009-09-30 15 views
6

Tengo una tabla de base de datos que representa eventos. La tabla tiene 2 campos principales EventDate y EventTitle.¿Cómo puedo agrupar por eventos por año usando una única consulta LINQ?

Estoy tratando de agrupar los eventos por año para que se muestren al usuario. Intento utilizar una consulta Linq para extraer los años distintos que tienen eventos y para cada año debe haber una lista de eventos en ese año. Entonces cada registro en la lista tendría un año y una lista de Eventos

Supongo que esto se puede hacer con una consulta de linq pero mi conocimiento de linq es básico. Hasta ahora sólo se han conseguido los distintos años en una lista con esta consulta:

var yearsList = (from e in Events 
       select e.EventDate.Year).Distinct(); 

¿Cómo puedo añadir una lista de eventos para cada registro de año?

+0

tuve que quitar la imagen de su puesto porque ImageShack les ha eliminado y los reemplazó con publicidad. Consulte http://meta.stackexchange.com/q/263771/215468 para obtener más información. Si es posible, sería genial que los vuelvas a subir. ¡Gracias! – Undo

Respuesta

8
var yearsList = from e in Events 
       group e by e.EventDate.Year into g 
       select new { Year = g.Key, Events = g }; 

que le dará una lista de objetos con una propiedad "Year" y una propiedad "Eventos" (todos los eventos de ese año).

Eche un vistazo a esta práctica referencia: 101 Linq Samples.

+0

Gracias! Bastante simple. – orandov

7

Realmente está buscando un grupo ordenado.

var yearsList = from e in Events 
       group e by e.EventDate.Year into g 
       orderby g.Key 
       select g; 

foreach(var yearGroup in yearsList) 
{ 
    int year = yearGroup.Key; 
    foreach(Event e in yearGroup) 
    { 
     // do something with the events 
    } 
} 
+0

Gracias por la respuesta. – orandov

1

Asumiendo que tiene la siguiente clase Event

public class Event 
    { 
      public int Year { get; set; } 
      public string Name { get; set; } 
      public static Event[] GetEvents() 
      { 
       return new Event[]   
       { 
       new Event{ Name="Event1", Year=2001}, 
       new Event{ Name="Event2", Year=2002}, 
       new Event{ Name="Event3", Year=2003}, 

       new Event{ Name="Event4", Year=2001}, 
       new Event{ Name="Event5", Year=2002}, 
       new Event{ Name="Event6", Year=2003}, 

       new Event{ Name="Event7", Year=2001}, 
       new Event{ Name="Event8", Year=2002}, 
       new Event{ Name="Event9", Year=2003} 
      }; 

     } 
} 

public class Program 
    { 
     static void Main(string[] args) 
     { 

      var groupedEvents = Event.GetEvents().GroupBy(e => e.Year); 

      foreach (var groupedEvent in groupedEvents) 
      { 
       Console.WriteLine("Year:{0}",groupedEvent.Key); 
       foreach (var evnt in groupedEvent) 
       { 
        Console.WriteLine("---- Event Name:{0}",evnt.Name); 
       } 
     } 


    } 
} 

Lo anterior debe darle eventos agrupados por año

Cuestiones relacionadas