EF Core 笔记

  1. Include()

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

     

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

     

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

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

     

    ThenInclude()

    “Include”在我们不需要多级数据的对象上运行良好,但如果需要获得多级数据,那么“ThenInclude”是最合适的。

     

    var customers = context.Companies
        .Include(i => i.Clients)
          .ThenInclude(a => a.CountriesOfOperation)
        .ToList();
    

     

     

    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});
    

     

     

    Virtual

    在实体框架Entity Framework 6及之前的版本中,数据模型的导航属性只要加上virtual关键字,在你访问这个属性的时候(不管是对象还是对象集合),EF的内部机制就会自动加载相关数据。这一特性就称之为Lazy Loading,其为开发带来极大方便(尤其需要快速开发的时候),因为不用操心去查询关联数据。当然缺点也很明显,就是这种查询方式其实是低效的,且在某些情况下使用不当也会造成性能问题。

posted @ 2021-11-05 14:10  奈何碧落黄泉  阅读(79)  评论(0编辑  收藏  举报