背景
话说有这么一家子,老公养了一条狗,老婆养了一只猫。
数据库的设计
人表
宠物表
通过表可以知道,宠物通过Owner指向主人的Id。
问题来了,我要和故事开头一样,老公-狗,老婆-猫,对应起来,怎么查询呢?
有同学说这还不简单?两个遍历一下不就行了。
首先 取出 List<宠物>集合,再根据宠物的主人Id去查找对应的主人信息就好了。
如果这样设计,那么将会执行3次查询:
l 查出所有的宠物。
l 查出阿猫的主人。
l 查出阿狗的主人。
数据量不大还好,数据量要是大一点这是非常影响速度的。这时,我们可以用到EF Core所有的Join方法进行多表查询。
我的做法是定义了一个PetsDetails的类,其代码如下:
public class PetsDetails { /// <summary> /// 宠物名称 /// </summary> public string PetName { get; set; } /// <summary> /// 主人名称 /// </summary> public string OwnerName { get; set; } }
用EF 的Join方法进行多表查询:
[HttpGet]
public List<PetsDetails> Get()
{
return _context.Pets.Join(_context.Persons,pet=>pet.Owner,per=>per.Id,(pet,per)=>new PetsDetails
{
PetName = pet.Name,
OwnerName = per.Name
}).ToList();
}
执行结果如图:
成功取到了宠物对应的主人的名称。
好处
原本需要进行3次查询的,用了Join方法后一次查询即可取到所需要的结果。我们看看这条Sql语句的样子:
我们看到其实这个需求是EF通过再sql语句中执行INNER JOIN实现的。
完整项目代码:
https://github.com/liuzhenyulive/EF-CORE-JOIN-Demo
您的支持是我最大的动力,如果满意,请帮我点击推荐。