【问题标题】:Bring back the Max Result for each item带回每个项目的最大结果
【发布时间】:2023-03-17 16:00:01
【问题描述】:

在此列表中,一位教师可以有多个 SchoolEndYears。我想修改这个查询,所以我只为每个老师获取最大值。

  • A老师 - 2012
  • A老师 - 2013
  • A 老师 - 2014 年
  • B 老师 - 2013 年
  • 教师 C - 2012

代码:

var    gridInfo = (from teacher in TeacherAccesses
                   join u in USERS
                   on teacher.ID equals u.ID
                   select new 
                   {
                      Name = u.LastName + ", " + u.FirstName,
                      ID = teacher.ID,
                      Flag = "Existing",
                      SchoolID = teacher.SchoolID,
                      status = teacher.TeacherAttr.IncludeinOfficialResults.Value,
                      SchoolEndYear = teacher.TeacherAttr.SchoolEndYear
                    }).OrderByDescending(x=>x.SchoolEndYear).OrderBy(x=>x.Name);

如您所见,我尝试执行 .OrderByDescending,但当我尝试执行 .FirstOrDefault 时,它只带回了组中的第一条记录。

我希望带回来的是:

  • A 老师 - 2014 年
  • B 老师 - 2013 年
  • 教师 C - 2012

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

    我认为您需要类似以下的内容,尽管我不确定这样做的效率如何:

    var gridInfo = (from teacher in TeacherAccesses
                    join u in USERS
                    on teacher.ID equals u.ID
                    where teacher.Year = TeacherAccesses.Where(x => x.ID = teacher.ID)
                                             .Max(x => x.TeacherAttr.SchoolEndYear)
                    select new 
                    {
                       Name = u.LastName + ", " + u.FirstName,
                       ID = teacher.ID,
                       Flag = "Existing",
                       SchoolID = teacher.SchoolID,
                       status = teacher.TeacherAttr.IncludeinOfficialResults.Value,
                       SchoolEndYear = teacher.TeacherAttr.SchoolEndYear
                     });
    

    这是一个简化的 LINQPad 示例:

    void Main()
    {
        var TeacherAccesses = new List<Teacher>() {
            new Teacher() { ID = 1, Name = "Teacher-A", TeacherAttr = new Attr() { SchoolEndYear = 2012 } },
            new Teacher() { ID = 1, Name = "Teacher-A", TeacherAttr = new Attr() { SchoolEndYear = 2013 } },
            new Teacher() { ID = 1, Name = "Teacher-A", TeacherAttr = new Attr() { SchoolEndYear = 2014 } },
            new Teacher() { ID = 2, Name = "Teacher-B", TeacherAttr = new Attr() { SchoolEndYear = 2012 } },
            new Teacher() { ID = 2, Name = "Teacher-B", TeacherAttr = new Attr() { SchoolEndYear = 2013 } },
            new Teacher() { ID = 3, Name = "Teacher-C", TeacherAttr = new Attr() { SchoolEndYear = 2012 } }
        };
        //TeacherAccesses.Dump();
        var latest =
            from teacher in TeacherAccesses
            where teacher.TeacherAttr.SchoolEndYear == TeacherAccesses.Where(x => x.ID == teacher.ID).Max(x => x.TeacherAttr.SchoolEndYear)
            select new {
                Name = teacher.Name,
                Year = teacher.TeacherAttr.SchoolEndYear
            };
        latest.Dump();
    }
    
    // Define other methods and classes here
    public class Teacher
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public Attr TeacherAttr { get; set; }
    }
    
    public class Attr
    {
        public int SchoolEndYear { get; set; }
    }
    

    结果:

    Teacher-A    2014
    Teacher-B    2013
    Teacher-C    2012
    

    【讨论】:

      【解决方案2】:

      您需要将同一位老师的记录分组在一起,然后应用Max 函数,它可以让您找到组的最大元素:

      var gridInfo = (from teacher in TeacherAccesses
                      ...
                     })
                     .GroupBy(x => x.ID)
                     .Select(g => g.Max(x => x.SchoolEndYear))
                     .OrderBy(x => x.Name);
      

      【讨论】:

      • 我在显示我最初拥有的列(名称、ID、标志)以及 Max SchoolEndYear 时遇到问题...有什么想法吗?
      • @webdad3,有什么问题?
      • 每当我运行您的查询时,我都会得到 SchoolEndYear。我需要姓名、ID、标志、SchoolID、状态和 SchoolEndYear。我尝试了几种变体,但没有任何效果
      猜你喜欢
      • 2014-10-14
      • 2019-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 2013-06-24
      • 2020-05-29
      相关资源
      最近更新 更多