上一篇博文已经介绍了什么是延迟加载:步步深入EF(二)—延迟加载.本篇博文主要介绍延迟加载的优化.
示例:
两张表:订单表(Order_Info)和产品表(Order_Detail)
订单表:包含2条订单
产品表:4件产品,分别属于上面两个订单
优化一
问题:查询每件产品属于哪个订单时,需要连接几次数据库?
本应该查询4次,EF做了优化后,查询2次。
public static void QueryUser()
{
IQueryable<Order_Detail>query = db.Order_Detail.Where(a => a.OrderID>0);
foreach (Order_Detail detail inquery)
{
Console.WriteLine("产品" + detail.ProductName
+ ",所属订单" + detail.Order_Info.OrderID);
}
}
为什么查询了2次?
当他发现4条产品的订单号有重复的时候,他就读取他自己的缓存数据,就不读取数据库里面的数据里,这是EF做的一个小优化。
优化二 include进行inner join查询
虽然EF为我们做了优化一,那当我们有1000个产品时,即使读取又重复的产品,那也需要去读1000次。之前我们只需要一个inner join就可以一次性读取出来。
//这里的include需要加载的文字,是从 Orderil_Detail的表结构里面订单的属性名字来复制的,注意是属性名字,而不是属性的类
IQueryable<Order_Detail>query = db.Order_Detail.Include("Order_Info").Where(a =>a.OrderID>0);
foreach (Order_Detail detail inquery)
{
Console.WriteLine("产品" + detail.ProductName
+ ",所属订单" + detail.Order_Info.OrderID);
}
通过使用include,我们可以实现查询一次数据库即可,相当于之前的inner join。如果关联多个表,可以使用多个include进行关联。