.NET WebApi 实战第八讲之EF联查及linq语句on多条件

        我们接着我们的项目继续EF方面的实战,前几节,我们隐隐约约的讲解到了数据库的建立、数据库与实体模型的映射(EF)、单表数据读写、GET、POST方法实现、接口返回数据格式等,现在我们来进行多表的数据联查。学习完本章之后,你就完全可以进行系统的开发,无论系规模有多大或者是多小。剩下的未学习的不外乎是系统性能部署方面的技能 ,比如反向代理、添加redis缓存器等,这些都不是多么高深不可测的技术,只要你把基础的东西学透了,理解透了,那些东西,自然而然就会了,或者是看看教程也就会了。

 

 

        打开我们的项目, 在开始之前,我们要先修改一个名称,其实也可以不修改。只是EF通常是把数据库映射习惯性的叫什么上下文context,所以,我们就依此习惯也改一下我们的映射名称。如下,全工程搜索csdnStudyEntities,将其全部修改为AppDbContext。建议你全部修改哦,否则,后面与实战中的不一致,阅读起来相当痛苦。

 现在我们要查一下:所有学生数学成绩大于90分的学生集合

同样,在开始之前,我们先手动插入一批数据,你可以调用你自己写的接口方法,也可以直接通过SQL语句直播插入!这里我们选择调用我们的接口直接往数据库里面写数据。在开始之前,我把之前所有的数据清空。

然后再插入用户数据,包括用户名、ID、性别、手机号,其它的字段先保持为空即可。我们之前写的插入用户的数据接口为GET方式,我们运行项目,打开API:每插入一次,就修改一下这两个字段值,插入10条左右的数据。

通过接口,我插入了如下11条数据:

现在我们来插入用户成绩数据:通过调用我们写的POST方法,注意,此时插入时,需要正确填写用户ID,你需要从 数据库表中复制出来正确填写uid参数,否则数据是无法写入数据库的。同时你动态修改其他字段的值,数值你自己填写,没有强行要求。只是为了后面的逻辑演示。最好有用户的数学成绩大于90的、等于90的、小于90的,这样便于你理解。

{
    "uid":"FDA763EB8EC64397A0F1F31B263902CB",
    "literature":"99",
    "math":"90",
    "enlish":"90",
    "bios":"91",
    "physical":"98",
    "history":"99",
    "createDate":""

我为每一个用户都插入了数据,一共插入了11条成绩数据:

然后我们再写一个数据库语句,将不在用户表中的用户的成绩清除掉!

delete from userAchievement where uid not in (select id from csdnUser)

选中执行以上语句 ,将我们之前生成的数据全部清除掉。避免干扰。

现在我们来再来写一个接口,实现我们即定的逻辑:所有学生数学成绩大于90分的学生集合

我们对此接口有一个要求,就是输入一个参数:用于返回大于等于这个数学成绩的集合。实现如下方法:

UserController.cs中实现如下GET方法:

可能很多同学对此语句一点也不了解,只是感觉特别像数据库查询语句SELECT *FROM WHERE !这种语句叫做linq语句,专门设计用于EF中用于代替写SQL语句,它只是将要得到的数据放在了最后  SELECT,后面章节我们将着重讲解Linq及涉及到的lamda表达式。同学们按照此教程继续进行即可。需要注意的是LinQ语句最后的toList()方法,如果不加,是会报错的!报错原因,后面我们再讲解。

写好后,运行起我们项目,URL输入以下条件:

https://localhost:44309/api/user/getMathAchData?score=90

参数输入90,根据我们的目的,我们是要查出数学成绩大于等于90的人的用户名单列表。

通过查询,我们正确得到了我们想要的数据,在用户表中查用户信息,成绩信息表用于数据条件过滤。现在我们来仔细分析一下上面Linq的逻辑:

from u in context.csdnUsers
join a in context.userAchievements

        u是 csdnUsers的别名,a是userAchievements的别名,通过别名可以快速的进行属性引用使用。减少代码的长度,阅读起来更为顺畅。join 则为联查,即把用户名和成绩表联合起来,根据后面的条件进行查询,我们要从成绩表中查询数据成绩大于90的集合,然后又需要使用成绩表的用户id字段uid在用户名表中查询用户信息!

on u.id equals a.uid 
where a.math >= score

        是不是感觉非常好用!全程我们并未在数据库中写存储过程或者是在代码中写数据库语句!至此,EF的联查技能你又顺利的掌握了!我还要说什么呢。

        有时候我们的EF联查on条件并不止一条,有可能是多条,这个时候,需要多字段的比较,on语句并没有and条件,这个时候就得用到以下的on多语句:当然你不用试,我们的成绩表中并没有mobile字段,这里只是列举说明展示一下on的多条件使用!或者是你把条件写到where里面也是可以的。所以,灵活处理,也是一个思维技能。

注意上面的红框on语句,里面使用的是new {} equals new {}及下面的select new {} ,这个被称为匿名表达式,其格式为:

{

key="",

key1=""

}

如果key省略掉不写,则用的是字面量为变量的名称:如上面的格式完整的写法是:

{

id=u.id,

}

匿名表达式在进行比较的时候,键名比较一一对应。如上图,你仔细看一下,a.uid就被明文的赋值给id。否则会报错的。如下:

我们来看看具体的报错信息,如下: 

一定要注意,匿名表达式中的key必须一一对应,一个叫什么,另一个就必须叫什么。

当然本节所涉及的知识技能点非常广 ,文字看起来并不多,但并不代表EF的联查就非常简单,表的联查也并不是这样简单容易,你首先要掌握最基础的技能,从而进行知识点与技能的提高,只有循序渐进,你才能渐入佳境,成为一个合理的后端码农!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhaocarbon

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值