这篇文章将讨论查询结果的控制

在使用EF(Entity Framework)的过程中,很多时候我们会进行查询的操作,因此知道哪些数据会被加载到内存当中就至关重要。在多多的情况下,你可能并并不需要加载全部的数据,而是只要加载一部分的数据即可。

默认情况下,EF仅仅加载查询中涉及的实体,但是它支持两种特性来帮助你控制加载:

1.贪婪加载

2.延迟加载

1.贪婪加载

对于下面的查询:

   using (var context = new MyDomainContext()) 
{
var orders = from o in context.Orders.Include("OrderDetails")
where o.CustomerName == "Mac"
select o;
}   这里我们指定加载客户名为Mac的订单,而且也希望加载相关的订单明细。

   你可以这样查看实际执行的 SQL 查询

      Console.WriteLine(orders.ToString());

实际上的 SQL 如下所示:

SELECT
[Project1].[OrderID] AS [OrderID],
[Project1].[OrderTitle] AS [OrderTitle],
[Project1].[CustomerName] AS [CustomerName],
[Project1].[TransactionDate] AS [TransactionDate],
[Project1].[C1] AS [C1],
[Project1].[OrderDetailID] AS [OrderDetailID],
[Project1].[OrderID1] AS [OrderID1],
[Project1].[Cost] AS [Cost],
[Project1].[ItemName] AS [ItemName]
FROM ( SELECT
[Extent1].[OrderID] AS [OrderID],
[Extent1].[OrderTitle] AS [OrderTitle],
[Extent1].[CustomerName] AS [CustomerName],
[Extent1].[TransactionDate] AS [TransactionDate],
[Extent2].[OrderDetailID] AS [OrderDetailID],
[Extent2].[OrderID] AS [OrderID1],
[Extent2].[Cost] AS [Cost],
[Extent2].[ItemName] AS [ItemName],
CASE WHEN ([Extent2].[OrderDetailID] IS NULL) THEN CAST(NULL AS int) ELS
E 1 END AS [C1]
FROM [dbo].[Orders] AS [Extent1]
LEFT OUTER JOIN [dbo].[OrderDetails] AS [Extent2] ON [Extent1].[OrderID]
= [Extent2].[OrderID]
WHERE N'Mac' = [Extent1].[CustomerName]
) AS [Project1]
ORDER BY [Project1].[OrderID] ASC, [Project1].[C1] ASC
    从上面个的SQL语句中可以看出想要查询一次Order表里面的数据就要对应的将OrderDetail里面的数据一起全都查出来。这么做的效率是十分低的,我们可以通过自己来写sql语句来完成。

2.延迟加载:

优点:

仅在需要的时候加载数据,不需要预先计划,从而避免了各种复杂的外连接、索引、视图操作带来的低效率问题

缺点:

       多次与数据库交互访问,导致性能降低,考虑到每访问父实体的子实体时,就需要访问数据库

使用方式:

      分为两步:

第一:

在需要的延迟加载的属性前加上virtual,该属性的类型可以是任务的集合类型 ICOLOOCT<T>或者是0、1..1关联属性

如,更新Category实体类,使之支持延迟加载

1
2
3
4
5
6
7
public class Category{  
     public int CategoryID { getset; }   
     public string CategoryName { getset; }   
     public string Description { getset; }  
     public byte[] Picture { getset; }  
     public virtual List<Product> Products { getset; }
     ...

第二:  在context构造器中开启延迟加载功能

public NorthwindContext() : base("name=NorthwindEntities""NorthwindEntities")

{

 ContextOptions.LazyLoadingEnabled = true;

_categories = CreateObjectSet<Category>();

 _products = CreateObjectSet<Product>();

}

由于集合是 POCO 的集合,所以,在访问的时候没有事件发生,EF 通过从你定义的实体派生一个动态的对象,然后覆盖你的子实体集合,通过访问属性来实现。这就是为什么需要标记你的子实体集        合属性为 virtual 的原因。

阻止延迟加载解决方案:

       Tolist(),返回的东西是个内存级的对象,就是说强迫它在这里执行一次SQL语句,查询到的东西放在Web服务器内存里,这里达到了缓存的效果,从而阻止了延迟加载

EF之贪婪加载和延迟加载的更多相关文章

  1. 学习EF之贪婪加载和延迟加载(1)

    从暑假开始接触code first以来,一直感觉很好用,主要在于开发过程中以业务为中心可以随时修改数据模型生成数据库,还有一个原因就是查询起来很方便 这里找了一个以前database first的一段 ...

  2. 【EfF】 贪婪加载和延迟加载 (virtual去掉关闭延迟加载)

    EntityFramework(EF)贪婪加载和延迟加载的选择和使用 贪婪加载:顾名思议就是把所有要加载的东西一 次性读取 1 using (var context = new MyDbContext ...

  3. EntityFramework(EF)贪婪加载和延迟加载的选择和使用

    贪婪加载:顾名思议就是把所有要加载的东西一 次性读取 1 using (var context = new MyDbContext()) 2 { 3 var orders = from o in co ...

  4. 【转】EntityFramework(EF)贪婪加载和延迟加载的选择和使用

    原谅:http://www.weixq.cn/Article/Detail/906 贪婪加载:顾名思议就是把所有要加载的东西一 次性读取 using (var context = new MyDbCo ...

  5. EF中的贪婪加载和延迟加载(懒加载)

    在上一章中,我们使用了Linq对Entity Framework进行了一个查询,但是通过学习我们却发现了懒加载给我来的性能上的开销是很到的,尤其是在循环中,如果数据量不是很多的情况下还可以接受,如果数 ...

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

    默认情况下,EF4.1是只查询到涉及到的数据对象,但是EF4.1支持两种方法进行控制其加载: 1.贪婪加载 2.延迟加载 使用的表还是上次使用的Order 和 OrderDetails两张表来举例说明 ...

  7. EntityFramework 贪婪加载与延迟加载以及资源回收

    EntityFramework的资源回收 1) Using 内包含Entity的上下文关系,对俩表做Add操作,最好可以直接写一个 entity.SaveChanges(); 完成两张表的同时add操 ...

  8. Entity Framework 4.1 : 贪婪加载和延迟加载

    这篇文章将讨论查询结果的加载控制. EF4.1 允许控制对象之间的关系,当我们进行查询的时候,哪些关系的数据将会被加载到内存呢?所有相关的对象都需要吗?在一些场合可能有意义,例如,当查询的实体仅仅拥有 ...

  9. 学习EF之贪懒加载和延迟加载(2)

    通过昨天对EF贪婪加载和延迟加载的学习,不难发现,延迟加载还是很好用的,但是问题也就来了,有的时候我们只需要加载一个实体,不需要和他相关的外部实体,这时候我们来看看EF延迟加载时怎么作用的吧 打开pr ...

随机推荐

  1. react 调用 function 的写法 及 解决 react onClick 方法自动执行

    1.react 调用方法的写法 (1)方式一 onClick={this.getFetchData.bind(this,item.id)} (2)方式二 getFetchData(e){ this.s ...

  2. sh脚本——#!/bin/bash

    #!/bin/bash是指此脚本使用/bin/bash来解释执行. 其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径. bash只是shell的一种,还有很多其它shell,如:sh ...

  3. C++错误——”无法启动程序”…\xxx.exe” 系统找不到指定的文件”

    背景 在VS2010环境下,升级了一个用C++编写的程序,编译生成成功,但是,不能在VS中直接运行(可以通过打开debug文件目录的exe应用程序运行),提示以下错误:”无法启动程序”…\xxx.ex ...

  4. java IO 框架图

  5. PHP框架的基本原理以及选择标准

    PHP框架的原理 说到PHP框架,可能很多PHP新手会感到有些胆怯.其实,PHP框架也不是那么深不可测的,框架就是别人使用PHP基础只是为你写好了的东西,只是封装在一起:这就好比我们使用PHP的函数, ...

  6. Vmware虚拟机安装XP系统

    刚开始下载的雨林木风ghost镜像,首先是虚拟机无法自动识别系统版本.然后启动的时候也是无法从光驱启动,又接连下载了几个版本的系统镜像, 都是ghost的,都不好使,百度,偶然发现有人提了一句,需要用 ...

  7. Chisel辅助iOS 应用程序调试,MusicApp模仿酷狗4.0 UI框架

    本文转载至 http://www.cocoachina.com/ios/20140825/9446.html Chisel Chisel集合了大量的LLDB 命令来辅助iOS 应用程序调试,并支持添 ...

  8. 用JS写九九乘法表

    本来JS部分觉得就不是很好,结果经过一个寒假,在家的日子过的太舒适,基本把学的都快忘干净了,今天老师一说九九乘法表,除了脑子里浮现出要满足的条件,其他的都不记得了,赶快整理了一下: <scrip ...

  9. 在yum出问题的情况下安装某个rpm包的方法

    1 核心命令 rpm -i 2 方法 centos镜像站去找到所有的rpm包. 安装这个rpm包,发现有一个依赖没有安装,就去下载安装.因为整体的包是有限的,因此终会收敛的. 比如安装rpmbuild ...

  10. Angular中的内置指令和自定义指令

    NG中的指令,到底是什么(what)? 为什么会有(why)?以及怎样使用(how)? What: 在NG中,指令扩展HTML功能,为 DOM 元素调用方法.定义行为绑定数据等. Why: 最大程度减 ...