EFcore 6.0 LINQ查询left join、group by、where综合查询

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

EFcore 6.0 LINQ查询left join、where、group by、having综合查询

示例表

TableClassinfo

classidclassname
1xx班
2yy班
3zz班

TableStudentsInfo

classidstudentNOname
11001张三
23018李四
21005王五
38002小明
34009小红

TableTestDetail

studentNOscoretestdate
1001902020-01-02
1005912020-01-02
1001772020-02-03
3018902020-02-03
8002652020-02-03
1001962020-03-07
3018872020-03-07
8002702020-03-07
4009992020-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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值