Model类:
public class StudentScore
{
public int ID { set; get; }
public string Name { set; get; }
public string Course { set; get; }
public int Score { set; get; }
public string Term { set; get; }
}
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Name => FirstName + LastName;
}
测试
Demo:
public static void TestLinq01() {
//1.准备数据源
List<StudentScore> list = new List<StudentScore>() {
new StudentScore(){ID=1,Name="张三",Term="第一学期",Course="Math",Score=80},
new StudentScore(){ID=1,Name="张三",Term="第一学期",Course="Chinese",Score=90},
new StudentScore(){ID=1,Name="张三",Term="第一学期",Course="English",Score=70},
new StudentScore(){ID=2,Name="李四",Term="第一学期",Course="Math",Score=60},
new StudentScore(){ID=2,Name="李四",Term="第一学期",Course="Chinese",Score=70},
new StudentScore(){ID=2,Name="李四",Term="第一学期",Course="English",Score=30},
new StudentScore(){ID=3,Name="王五",Term="第一学期",Course="Math",Score=100},
new StudentScore(){ID=3,Name="王五",Term="第一学期",Course="Chinese",Score=80},
new StudentScore(){ID=3,Name="王五",Term="第一学期",Course="English",Score=80},
new StudentScore(){ID=4,Name="赵六",Term="第一学期",Course="Math",Score=90},
new StudentScore(){ID=4,Name="赵六",Term="第一学期",Course="Chinese",Score=80},
new StudentScore(){ID=4,Name="赵六",Term="第一学期",Course="English",Score=70},
new StudentScore(){ID=1,Name="张三",Term="第二学期",Course="Math",Score=100},
new StudentScore(){ID=1,Name="张三",Term="第二学期",Course="Chinese",Score=80},
new StudentScore(){ID=1,Name="张三",Term="第二学期",Course="English",Score=70},
new StudentScore(){ID=2,Name="李四",Term="第二学期",Course="Math",Score=90},
new StudentScore(){ID=2,Name="李四",Term="第二学期",Course="Chinese",Score=50},
new StudentScore(){ID=2,Name="李四",Term="第二学期",Course="English",Score=80},
new StudentScore(){ID=3,Name="王五",Term="第二学期",Course="Math",Score=90},
new StudentScore(){ID=3,Name="王五",Term="第二学期",Course="Chinese",Score=70},
new StudentScore(){ID=3,Name="王五",Term="第二学期",Course="English",Score=80},
new StudentScore(){ID=4,Name="赵六",Term="第二学期",Course="Math",Score=70},
new StudentScore(){ID=4,Name="赵六",Term="第二学期",Course="Chinese",Score=60},
new StudentScore(){ID=4,Name="赵六",Term="第二学期",Course="English",Score=70},
};
//2.根据姓名进行分组,然后Sum求总分,Average求平均分
var studentScores= list.GroupBy(x => x.Name)
.Select(x => new { Name = x.Key, Scores = x.Sum(s => s.Score),Courses=x.Count(),
AverageScores=Math.Round(x.Average(s => s.Score))
});
//x实际代表的是每个分组后的的数据,key代表的是分组的字段
//3.根据多个字段进行分组 :根据学期和课程:组装到匿名对象中
var list1= list.GroupBy(x=>new {Term=x.Term,Course=x.Score})
.Select(x=> new {Term=x.Key.Term,Course=x.Key.Course,
AverageScores=x.Average(s=>s.Score)
});
//这里的key代表的是分组的匿名对象
//对分组后的数据,进行筛选,在SQL中,用HAVing子句,而Linq中没有
//采用where语句对Group后的结果过滤。
//4.分组,带有Having的查询,查询均分>60的学生
var list2 = list.GroupBy(x => new { Term = x.Term, Course = x.Score })
.Where(x=>x.Average(m=>m.Score)>60)
.Select(x => new {
Term = x.Key.Term,
Course = x.Key.Course,
AverageScores = x.Average(s => s.Score)
});
}