EFCore使⽤Include和join,以及Include和ThenInclude区别
EF Core使⽤Include和join
在EF中表连接常⽤的有Join()和Include(),两者都可以实现两张表的连接,但⼜有所不同。
例如有个唱⽚表Album(AlbumId,Name,CreateDate,GenreId),表中含外键GenreId连接流派表Genre(GenreId,Name)。每个唱⽚归属唯⼀⼀个流派,⼀个流派可以对应多个唱⽚。
1.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。
2.Include():
两表必须含有外键关系,只需要指定键名对应的类属性名即可,不需指定结果字段(即全部映射)。默认搜索某表时,不会顺带查询外键表,直到真正使⽤时才会再读取数据库查询;若是使⽤ Include(),则会在读取本表时把指定的外键表信息也读出来。
那么可以这么写两个表的连接:
//EF已经⽣成了Album和Genre的数据库映射模型类以及导航属性
var wholeRecord=dc.Album.Include("Genre");
//或者
//var wholeRecord=dc.Album.Include(a=>Genre);
这样数据库就执⾏了⼀个左连接,把Album和Genre的所有字段全部连起来了,并且Include()是⽴即查询的,像ToList()⼀样,不会稍后延迟优化后再加载。
这样其实效率很低,因为如果两张表记录很⼤,那么连接是个费时费资源的事情,建议少⽤,或者先筛选出需要的结果集再连接。Include和ThenInclude区别connect和join的区别
“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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论