ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

EF Core使用Include和join,以及Include和ThenInclude区别和使用

2022-07-26 09:04:21  阅读:175  来源: 互联网

标签:Core join Name get var GenreId Include public


在EF中表连接常用的有Join()和Include(),两者都可以实现两张表的连接,但又有所不同。

例如有个唱片表Album(AlbumId,Name,CreateDate,GenreId),表中含外键GenreId连接流派表Genre(GenreId,Name)。每个唱片归属唯一一个流派,一个流派可以对应多个唱片。

join():

两表不必含有外键关系,需要代码手动指定连接外键相等(具有可拓展性,除了值相等,还能指定是>,<以及其他对两表的相应键的关系),以及结果字段

var wholeRecord = dc.Album.Join(dc.Genre, a => a.GenreId, g => g.GenreId, (a, g) => new { a.AlbumId,a.Name,g.GenreId,g.Name;

这样就选取除了两表的AlbumId,Name,GenreId,Name。

Include():

两表必须含有外键关系,只需要指定键名对应的类属性名即可,不需指定结果字段(即全部映射)。默认搜索某表时,不会顺带查询外键表,直到真正使用时才会再读取数据库查询;若是使用 Include(),则会在读取本表时把指定的外键表信息也读出来

 

//EF已经生成了Album和Genre的数据库映射模型类以及导航属性
var wholeRecord=dc.Album.Include("Genre");
//或者
//var wholeRecord=dc.Album.Include(a=>Genre);

这样数据库就执行了一个左连接,把Album和Genre的所有字段全部连起来了,并且Include()是立即查询的,像ToList()一样,不会稍后延迟优化后再加载。

这样其实效率很低,因为如果两张表记录很大,那么连接是个费时费资源的事情,建议少用,或者先筛选出需要的结果集再连接。

Include和ThenInclude区别

“Include”在我们不需要多级数据的对象上运行良好,但如果需要获得多级数据,那么“ThenInclude”是最合适的。让我用一个例子解释一下。假设我们有3个实体,公司,客户经理和顾客:

public class Company
{
    public string Name { get; set; }

    public class Manager{ get; set; }

}

public class Manager
{
    public string Name { get; set; }
    
    public class Client { get; set; }
}

 public class Client
 {
    public string Name { get; set; }

    public string ClientMessage { get; set; }
 }

现在,如果你想公司和公司下的客户经理你可以像下面那样使用“Include”,这样你拿到的是company的name和Manager的name

using (var context = new YourContext())
{
  var customers = context.Company
    .Include(c => c.Clients)
    .ToList();
}

但是如果您想要公司和客户经理以及顾客,因为顾客没有直接和公司关联,所以不能使用include直接关联到,这时候您可以使用“ThenInclude”,这样你拿到的就是company的name和Manager的name还有Client的ClientMessage

using (var context = new MyContext())
{
   var customers = context.Company
    .Include(i => i.Manager )
      .ThenInclude(a => a.ClientMessage )
    .ToList();
}

这相当于用关联出来的manager去关联client

标签:Core,join,Name,get,var,GenreId,Include,public
来源: https://www.cnblogs.com/daboluo/p/16519550.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有