如何使用单个LINQ查询按年度按事件分组?

时间:2009-09-30 23:27:01

标签: c# linq

我有一个代表Events的数据库表。该表有两个主要字段EventDate和EventTitle。

我正在尝试按年份对事件进行分组以显示给用户。我正在尝试使用Linq查询来拉动具有事件的不同年份,并且每年应该有一个事件列表。因此,列表中的每条记录都有一年和事件列表

我认为这可以通过一个linq查询完成,但我的linq知识是基本的。 到目前为止,我只在这个查询的列表中得到了不同的年份:

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

如何向每年记录添加事件列表?

3 个答案:

答案 0 :(得分:8)

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

这将为您提供具有“年”属性和“事件”属性的对象列表(该年度的所有事件)。

看看这个方便的参考:101 Linq Samples

答案 1 :(得分:7)

你真的在寻找一个有序的团体。

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

答案 2 :(得分:1)

假设您有以下事件类

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


   }
}

以上内容应该为您提供按年度分组的事件