EF Core 笔记
-
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,其为开发带来极大方便(尤其需要快速开发的时候),因为不用操心去查询关联数据。当然缺点也很明显,就是这种查询方式其实是低效的,且在某些情况下使用不当也会造成性能问题。