2014-06-17 39 views
0

在此列表中,教師可以有多個SchoolEndYears。我想修改這個查詢,所以我只是爲每位老師抓取最大值。爲每個項目帶回最大結果

  • TeacherA - 2012
  • TeacherA - 2013
  • TeacherA消息 - 2014年
  • TeacherB - 2013
  • TeacherC - 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它只會帶回組中的第1條記錄。

什麼我希望能帶回來的是:

  • TeacherA消息 - 2014年
  • TeacherB - 2013
  • TeacherC - 2012

回答

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 
1

你需要的是爲同一個老師組記錄一起,然後申請一個Max功能,允許你找到該組的最大元素:

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

我有一個問題,顯示我最初有(名稱,ID,國旗)以及Max SchoolEndYear ...你的想法? – webdad3

+0

@ webdad3,有什麼問題? – Andrei

+0

每當我運行你的查詢,我只是得到SchoolEndYear。我需要姓名,身份證,國旗,學校編號,身份和SchoolEndYear。我嘗試了幾個變化,但沒有得到任何工作 – webdad3