gpt4 book ai didi

c# - 对 LINQ 查询进行分组

转载 作者:行者123 更新时间:2023-11-30 12:14:54 24 4
gpt4 key购买 nike

我有三个表:

  • 程序
    • 身份证
    • 姓名
  • 时间表
    • 程序编号
    • 可用点
  • 日程表
    • 日程表编号
    • 开始日期
    • 结束日期

Program 是一种事件,而 Schedule 是 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 月 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>其中键是带有 Startdate 的匿名类型和 Enddate属性(都是 DateTime s),元素是匿名类型 Program , ScheduleDate元素。您可以调整它以仅包含您关心的那些细节。

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

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

关于c# - 对 LINQ 查询进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8568479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com