EF学习和使用(六)显式加载、按需加载

这篇博客接着说EF加载数据的方式,今天介绍剩下的两种:显式加载和按需加载。


显式加载(Explicit Loading)

显式加载和延迟加载非常类似,不同的是显式加载要手动关闭EF的延迟加载属性,通过代码ctx.Configuration.LazyLoadingEnabled = false;来完成。

using (var dbcontext= new ModelFirstDemoEntities())
{
    dbcontext.Configuration.LazyLoadingEnabled = false;
            #region 显式加载:查询部分列数据,前提关闭 懒加载
            //查询表中部分列的数据
            var items = from c in dbcontext.Customer
                        select c;
            foreach (var item in items)
            {
                //条件判断,只加载满足条件的数据,减少访问数据库的次数
                if (item.Id < 5)
                {
                    dbcontext.Entry(item).Collection(c => c.Order).Load();
                    Console.WriteLine(item.CusName);
                }

                foreach (var order in item.Order)
                {
                    Console.WriteLine("Course name : {0}", order.OrderContent);
                }
            }
            #endregion
}

EF学习和使用(六)显式加载、按需加载_第1张图片


通过在SQL Server Profiler中的跟踪记录可以看到一共执行了4次对Order表的查询。显式加载的意义就在于我们可以通过添加判断条件,对数据加载方式进行控制,从而有效地减少程序与数据库交互的次数。大多数情况下,我们从数据库获取到的数据并不都是需要的,如果每次只有很少一部分数据有用,那么我们为什么不过滤掉那些无用的数据从而尽量较少数据交互的次数呢?

按需加载

其实EF并不存在按需加载的概念,但是这种方式很值得说一说,在加载数据的时候并不是需要所有的属性值,可能只需要一个Id,Name值。所以我们可以对要查询的实体进行一下筛选,只加载自己需要的某些列,避免加载大量的垃圾数据。在这里按需加载的概念只是加载需要的列。可能会与前端开发中 的概念“按需加载”有所冲突。

            #region 按需加载:查询部分列数据
            //查询表中部分列的数据
            var items = from c in dbcontext.Customer
                        where c.Id < 10
                        select new { Id = c.Id, CName = c.CusName, OrderCount = c.Order.Count() };
            foreach (var item in items)
            {
                Console.WriteLine(item.CName);
            }
            #endregion

现在EF所谓的四种加载数据的方式都已经介绍完了, 相信大家对这几种方式都有了一定的认知,知道了在什么情况下使用何种方式较好。就像前面所说,选择什么样的数据加载方式需要因时而异,每一种数据加载方式都有它存在的意义,但目的只有一个,那就是以最小的代价获取到需要的数据。

你可能感兴趣的:(ef,按需加载,显式加载)