EF4.1之贪婪加载和延迟加载

默认情况下,EF4.1是只查询到涉及到的数据对象,但是EF4.1支持两种方法进行控制其加载:

 1、贪婪加载

 2、延迟加载

使用的表还是上次使用的Order 和 OrderDetails两张表来举例说明

1、贪婪加载

看下面一段代码:

1                 var orders = from o in db.Orders.Include("OrderDetails")
2                              where o.CustormName == "xiaoxiao"
3                              select o;

我们可以 直接Tostring()输出:下面是输出结果:

通过查询语句我们可以看出,我们只要是想要查询一次 Order表里面的数据就要对应的将OrderDetail 里面的数据也一起全都查询出来。这样做的效率是非常低的。其实我们也是可以通过自己写sql语句来完成,后面我会讲到关于 T-sql的内容,就是EF支持sql脚本执行的API。

 

2、延迟加载

EF4.1默认是支持延迟加载,如果我们要是想要禁用掉他可以在 模型构建器里面将其禁用掉:

1         public DbEntities()
2         {
3             this.Configuration.LazyLoadingEnabled = false;//禁用掉 延迟加载
4         } 

如何实现延迟加载:

    public class Order
    {
        public int OrderId { set; get; }
        
        public string OrderCode { set; get; }
        
        public string CustormName { set; get; }

       
        public virtual ICollection<OrderDetail> OrderDetails { set; get; }
    }

通过virtual关键字来实现延迟加载:那又是怎么实现的呢:当EF访问你的 子实体的时候,会动态生成一个子实体对象,进而覆盖掉子实体对应的属性,这就是为什么标记为 virtual虚拟的原因了。

总结:

贪婪加载:一次将数据全都查询出来,所以在使用的时候一定要注意效率的问题。

延迟加载:非常宽容,当需要的时候才加载数据。

posted @ 2013-11-13 19:38  小小gogo  Views(1047)  Comments(0Edit  收藏  举报