繁体   English   中英

对LINQ查询进行分组

[英]Grouping a LINQ query

我有三张桌子:

  • 程序
    • ID
    • 名称
  • 时间表
    • ProgramId
    • AvailableSpots
  • ScheduleDates
    • ScheduleId
    • 开始日期
    • 结束日期

程序是一种事件,而附表是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来获得January 1-14

从这里开始,我不知道如何通过匹配开始/结束日期对它们进行分组,然后将匹配项下的项目分组。

您可以按包含您关注的元素的匿名对象进行分组:

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> ,其中键是具有StartdateEnddate属性的匿名类型(都是DateTime s),元素是具有ProgramScheduleDate元素的匿名类型。 您可以调整此选项以仅包含您关注的细节。

当用作对象时,匿名类型实现GetHasCode()Equals ,如果每个对应的属性相等,则认为它们相等(类似于struct s的默认相等,但是编译而不是通过反射,因此它表现更好)。

与其他查询提供程序一起使用时(例如linq2sql等)。 提供者应该意识到这一点,因此将分组传递给数据库,尽管有时它在这方面是不完美的(仍然有效但不是在数据库层完成的所有工作)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM