List<Teacher> teachers = new List<Teacher> {
new Teacher("徐老师",
new List<Student>(){
new Student("宋江",80),
new Student("卢俊义",95),
new Student("朱武",45)
}
),
new Teacher("姜老师",
new List<Student>(){
new Student("林冲",90),
new Student("花荣",85),
new Student("柴进",58)
}
),
new Teacher("樊老师",
new List<Student>(){
new Student("关胜",100),
new Student("阮小七",70),
new Student("时迁",30)
}
)
};
var query1 = from t in teachers
from s in t.Students
where s.Score < 60
select new
{
t,
teacherName = t.Name,
student = t.Students.Where(p => p.Score < 60).ToList()
};
foreach (var item in query1)
{
Console.WriteLine("老师姓名:" + item.teacherName + ",学生姓名:" + item.student.FirstOrDefault().Name + ",成绩:" + item.student.FirstOrDefault().Score);
}
1.我在控制台中写了linq语句,如何才能查看该linq语句生成的SQL语句呢?
2.该条linq语句中为什么要对学生成绩做两次筛选呢?
query1.ToString()
不管用啊
@天亦玄: 刚刚没注意,你这里没有使用Entity Framework,使用EF才会生成SQL
LINQ != SQL
LINQ= Language-Integrated Query (LINQ)
https://docs.microsoft.com/en-us/dotnet/csharp/linq/
你现在用的这基本算是属于 Linq to Object, 不会翻译成SQL语句的。
说回你的问题,仔细看了一下,其实LINQ的优点是容易理解(对学习过SQL的人容易理解)
很显然你没学过SQL,哈哈。
我们先看第一段
Where Score>60,这个你应该理解,我就不说了。
关键是第二段
select new { t, teacherName = t.Name, student = t.Students.Where(p => p.Score < 60).ToList() };
你想想,你Select 的是t= teacher,那么第一段的where 几乎是无用功(对你目前的数据来说是无用的)
等于所有的Teacher还是选择上了。
这时候你又对t选择 students,那当然还是所有的Students了,所以,只好再来一次where score>60了。
就事论事,解释就是上面这样了。
如果是要说到需求或者代码,那这段代码当然写得很土很天真了,真的代码肯定不会这样写的。