C# 返回每个项目的最大结果

C# 返回每个项目的最大结果,c#,linq-to-sql,C#,Linq To Sql,在此列表中,教师可以有多个学年。我想修改这个查询,所以我只获取每个老师的最大值 教师-2012 教师-2013 教师-2014 教师B-2013 教师C-2012 代码: var gridInfo = (from teacher in TeacherAccesses join u in USERS on teacher.ID equals u.ID select new

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

  • 教师-2012
  • 教师-2013
  • 教师-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
时,它只返回组中的第一条记录

我希望带回的是:

  • 教师-2014
  • 教师B-2013
  • 教师C-2012

我认为您需要以下内容,尽管我不确定这是否有效:

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

您需要将同一教师的记录分组在一起,然后应用
Max
函数,该函数允许您查找组中的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,有什么问题吗?每当我运行你的查询时,我只会得到学年结束。我需要姓名、身份证、旗帜、学校ID、状态和学校年终。我尝试了几种不同的方法,但都没有成功