EFcore 6.0 LINQ查询left join、where、group by、having综合查询
示例表
TableClassinfo
| classid | classname |
|---|---|
| 1 | xx班 |
| 2 | yy班 |
| 3 | zz班 |
TableStudentsInfo
| classid | studentNO | name |
|---|---|---|
| 1 | 1001 | 张三 |
| 2 | 3018 | 李四 |
| 2 | 1005 | 王五 |
| 3 | 8002 | 小明 |
| 3 | 4009 | 小红 |
TableTestDetail
| studentNO | score | testdate |
|---|---|---|
| 1001 | 90 | 2020-01-02 |
| 1005 | 91 | 2020-01-02 |
| 1001 | 77 | 2020-02-03 |
| 3018 | 90 | 2020-02-03 |
| 8002 | 65 | 2020-02-03 |
| 1001 | 96 | 2020-03-07 |
| 3018 | 87 | 2020-03-07 |
| 8002 | 70 | 2020-03-07 |
| 4009 | 99 | 2020-03-07 |
LINQ代码:
using (var context = new SchoolContext())
{
var list1
= (from c in context.Set<TableClassinfo>()
//下句翻译sql:TableClassinfo c left join TableStudentsInfo s on c.classid = s.classid
//下面代码中的join可以当成sql中的left join;on就是sql中的on,这俩格式跟sql中的一模一样。
// 只不过还要给【当前右表】起个临时标识名称,随便起,如下示例,起名T2join
//然后on完之后,加个【into 标识名】 ,再加一句【from 右表 in 标识名.DefaultIfEmpty() 】就完事了。
//注意:这里加了.DefaultIfEmpty() 才表示left join,如果不加就变成inner join了。
//全部代码如下所示:
join s in context.Set<TableStudentsInfo>()
on c.classid equals s.classid into sjoin
from s in sjoin.DefaultIfEmpty()
//下句翻译sql:TableStudentsInfo s left join TableTestDetail t on s.studentNO =t.studentNO
join t in context.Set<TableTestDetail>()
on s.personNO equals t.personNO into tjoin
from t in tjoin.DefaultIfEmpty()
//跟sql一样,多表联合查询的where应放在【from...join...】的后面,格式跟sql基本一样
.Where(c.classid> 2 || T1.id<9) && s.name !="张三"
//下句翻译sql:group by c.classid , s.studentname
group new { c, s , t } by new { c.classid , c.classname, s.studentno, s.studentname } into grp
where grp.Sum(x =>x.t.score )>500
//group..by..into..后面跟where等同于sql的having
//此句示例即等于:having sum(TableTestdetail.score) > 500 //查询分数总计大于500的人员
select new //等同于sql中的select
{
//key也就是分组字段了
班级名= grp.Key.classname ,
学号 = grp.Key.studentno
姓名= grp.Key.name ,
//聚合字段
最高分数 = grp.Max(x => x.t.score),
总分累计= grp.Sum(x=>x.t.score)
} ) .ToList();
}
翻译成sql
select c.classname as 班级名, s.studentno as 学号,s.name as 姓名,
max(t.score) as 最高分数, sum(T3.score) as 总分累计
from TableClassinfo c
left join TableStudentsInfo s on c.classid=s.classid
left join TableTestDetail t on s.studentno=t.studentno
where (c.classid> 2 or c.classid<9) and s. name !="张三"
group by c.classid ,c.classname, s.studentno, s.name
having Sum(t.score )>500

本文详细介绍了如何在EFcore 6.0中使用LINQ进行复杂的查询操作,包括left join、where条件过滤、group by分组以及having子句,结合具体示例表TableClassinfo、TableStudentsInfo和TableTestDetail,展示了一段完整的LINQ查询代码,并转换为对应的SQL语句,帮助开发者理解和应用这些高级查询技巧。
1746

被折叠的 条评论
为什么被折叠?



