步步深入EF(三)—优化延迟加载

  

   上一篇博文已经介绍了什么是延迟加载:步步深入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进行关联。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值