我有三张桌子:
程序是一种事件,而附表是ScheduleDates的集合,因为程序会持续数天。
我希望能够显示如下列表:
// 1st is the earliest ScheduleDate and 14th is the latest. The records in between
// are ignored.
January 1-14
Program 1 5 spots left
Program 2 10 spots left
January 10-24
Program 1 0 spots left
January 20-31
Program 3 10 spots left
我需要浏览所有的时间表,并按开始/结束日期对它们进行分组,以便我可以显示该时间段内发生的所有节目。
我对LINQ并不熟悉,据我所知,这是:
var schedules = from program in _db.Programs
join schedule in _db.Schedules on program.Id equals schedule.ProgramId
join date in _db.ScheduleDates on schedule.Id equals date.ScheduleId
// a few where clauses
orderby date.Startdate
group date by date.Schedule into sch
select sch;
我不确定这是否正确,但它确实为我提供了我的时间表及其相关日期的分组列表,我可以.First
和.Last
来获取{{ 1}}。
从这里开始,我不知道如何通过匹配开始/结束日期对它们进行分组,然后将匹配下的项目分组。
答案 0 :(得分:3)
您可以按包含您关注的元素的匿名对象进行分组:
var schedules = from program in _db.Programs
join schedule in _db.Schedules on program.Id equals schedule.ProgramId
join date in _db.ScheduleDates on schedule.Id equals date.ScheduleId
// a few where clauses
orderby date.Startdate
group new{Program = program, Schedule = schedule, Date = date} by new{date.Schedule.Startdate, date.Schedule.Enddate};
上面的内容返回IEnumerable<IGrouping>
,其中密钥是匿名类型,其中包含Startdate
和Enddate
属性(两个DateTime
s),并且元素是匿名类型, Program
,Schedule
和Date
个元素。您可以调整此选项以仅包含您关注的细节。
当用作对象时,匿名类型实现GetHasCode()
和Equals
,如果它们的每个对应属性相等,则认为它们相等(类似于struct
的默认等式,但是编译而不是通过反射,因此它表现得更好。)
与其他查询提供程序一起使用时(例如linq2sql等)。提供者应该意识到这一点,因此将分组传递给数据库,尽管有时它在这方面是不完美的(仍然有效但不是在数据库层完成的所有工作)。