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


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

EF4.1 允许控制对象之间的关系,当我们进行查询的时候,哪些关系的数据将会被加载到内存呢?所有相关的对象都需要吗?在一些场合可能有意义,例如,当查询的实体仅仅拥有一个相关的子实体,但是,多数情况下,你可能只需要加载部分数据,或者你喜欢的话,加载更多的数据。

默认情况下, EF4.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],
CASEWHEN ([Extent2].[OrderDetailID]ISNULL) THENCAST(NULLASint) ELS
E
1ENDAS[C1]
FROM[dbo].[Orders]AS[Extent1]
LEFTOUTERJOIN[dbo].[OrderDetails]AS[Extent2]ON[Extent1].[OrderID]
=[Extent2].[OrderID]
WHERE N'Mac'=[Extent1].[CustomerName]
)
AS[Project1]
ORDERBY[Project1].[OrderID]ASC, [Project1].[C1]ASC
复制代码

EF4.1 生成的 SQL 不是特别易读,但是这个查询你应该能够看懂,订单明细被一起加载了。

这带来了一个关于贪婪加载的问题:查询效率。如果你执行这样的查询来获取订单和订单明细,也可以变成写出等效的查询语句,如果喜欢的话,可以更加聪明地写出返回两个查询结果的查询,一个是订单,另外一个是订单明细。这应该更加有效,因为你不需要为每一个订单明细重复订单的信息。由于一些原因,EF 并不支持。记住这一点,因为这很容易使性能变差。

无论如何,你还可以在查询中包含更多的子集。

var orders =from o in context.Orders.Include("OrderDetails").Include("Businesses")
where o.CustomerName == "Mac"
select o;

延迟加载

另外一个特性就是延迟加载,默认情况下,延迟加载被支持,如果你希望禁用它,必须显式声明,最好的位置是在 DbContext 的构造器中。

public MyDomainContext()
{
this.Configuration.LazyLoadingEnabled
= false;
}

这样延迟加载就如你所愿了。当查询一个实体集的时候,相关的子实体也一并加载。

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

复制代码
public class Order
{
publicint OrderID { get; set; }
public string OrderTitle { get; set; }
public string CustomerName { get; set; }
publicDateTime TransactionDate { get; set; }
public virtual List<OrderDetail> OrderDetails { get; set; }
public virtual List<Business> Businesses { get; set; }
}
复制代码

总结一下两种加载方式的特点

贪婪加载:

  • 减少数据访问的延迟,在一次数据库的访问中返回所有的数据。
  • 你需要知道你将作什么,并且显式声明

延迟加载:

  • 非常宽容,因为只在需要的时候加载数据,不需要预先计划
  • 可能因为数据访问的延迟而降低性能,考虑到每访问父实体的子实体时,就需要访问数据库。

现在,什么时候我们应该使用哪种机制?我的建议是:除非需要循环中加载数据,我使用延迟加载。这样的话,可能会造成2-3 次服务器的查询,但是仍然是可以接受的,特别是考虑到贪婪加载的效率问题。

转载于:https://www.cnblogs.com/tianboblog/p/3229228.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python数据结构编程_写给Python编程高手之 数据结构

python视频教程栏目介绍Python编程需要注意的关键点。如何在列表&#xff0c;字典&#xff0c;集合中根据条件筛选数据案例&#xff1a;如何在下列列表data中筛选出大于0的数data [1, -1, 2, 3, 4, 7]复制代码使用filter函数&#xff0c;第一个参数为一个函数&#xff0c;也可…

python编写下载器可暂停_Python编写一个优美的下载器

本文实例为大家分享了python编写下载器的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 #!/bin/python3# author: lidawei# create: 2016-07-11# version: 1.0# 功能说明&#xff1a;# 从指定的URL将文件取回本地#################################################…

修改页面后获得flag_简单的CTF-从JS中获取flag

本文是一篇从合天网安实验室进行实验操作的笔记&#xff0c;一次非常简单地从JS中获取到flag的操作。1. 进入题目页(10.1.1.219:20123)看到一段话&#xff0c;还有一句很明显的提示语句“The evil url is the passkey”&#xff0c;翻译出来就是损坏的url就是flag。下面的英文…

快速下载助手1.1--添加断点下载

在上一章中实现了多线程的断点下载&#xff0c;将快速下载助手添加断点下载功能&#xff0c;明天实现了速率统计功能 效果图如下&#xff1a; 打印信息如下&#xff1a; 欢迎使用快速下载助手-->并不是线程多就下载的快! 文件夹已经存在 默认的线程个数&#xff1a;3 保存路…

mysql查询自定义数据_实现自定义查询的数据库设计及实现(一)

需求先说一下需求&#xff1a;实现用户自定义的查询&#xff0c;用户可以自定义要查询的列、自定义条件条件、自定义排序。除了查询使用外&#xff0c;还可以使用于各个需要根据条件进行约束的业务&#xff0c;如权限&#xff1b;本设计和实现&#xff0c;很大部分是通过数据库…

java 合并流_Java Stream 流实现合并操作示例

本文实例讲述了Java Stream 流实现合并操作。分享给大家供大家参考&#xff0c;具体如下&#xff1a;1. 前言Java Stream Api提供了很多有用的 Api 让我们很方便将集合或者多个同类型的元素转换为流进行操作。今天我们来看看如何合并 Stream 流。2. Stream 流的合并Stream 流合…

java 去掉 t_java中的“\t”

对于初学者来说&#xff0c;java中的"\t"和空格总是让人迷惑&#xff0c;其实很简单&#xff0c;通过一个例子就能很快明白&#xff01;比如说打印九九乘法表&#xff01;先来看用空格的效果&#xff01;1 package cn.edu.nwpu.java;23 public class MultiplicationT…

java service层 事务_Java高并发秒时啊API之Service层1

---2-1 使用Spring托管Service依赖理论----------------------------spring ioc优势(工厂模式):1.对象创建统一托管2.规范的生命周期管理3.灵活的依赖注入4.一致的获取对象Spring IOC 功能的理解DAO依赖Service依赖最终形成一致访问接口&#xff1b;随意访问依赖对象Spring IOC…

zoj 3720

为什么注释掉的地方是错的&#xff1f; 自己的代码好糟烂..... 直接枚举点 判是否在多边形内 加起来求概率 求面积的时候代码写搓了.... 比不过别人两行的代码 而且到现在还找不到错..... #include <iostream> #include <fstream> #include <cstri…

void在java中是什么意思_java中void什么意思

在java中&#xff0c;void代表的意思是“空”&#xff0c;即“什么都不返回”&#xff0c;在方法申明的时候表示该方法没有返回值。void对应着一个Void类&#xff0c;Void类是用final修饰的&#xff0c;是一个不可实例化的占位符类。之前&#xff0c;在学C的数据类型的时候发现…

《设计模式》-模板模式

玩物丧志啊&#xff01;&#xff01;&#xff01;最近总想着玩&#xff0c;休息&#xff0c;结果又耽误了半个月。。唉&#xff01; 惭愧啊。 今天是设计模式的倒数第二个了。。 虽然前面的 忘得差不多了。不过等看完了 要进行总复习&#xff0c;再复习&#xff0c;再回归&…

一看就会之—利用IIS服务发布网站(实践篇)上

转自&#xff1a;http://blog.csdn.net/zwk626542417/article/details/9796259 概述 IIS全称为互联网信息服务&#xff0c;是由微软公司提供的基于运行MicrosoftWindows的互联网基本服务&#xff0c;今天我们主要来看下如何用win7系统自带的IIS服务来发布我们开发的一个简单的…

xp变量 java_winxp系统设置java环境变量的详细教程

我们都知道想要进行java的程序编辑&#xff0c;就要首先在电脑上设置环境变量&#xff0c;这样才能够运行java程序&#xff0c;下面一起看看xp系统的电脑如何设置java变量。1、设置环境变量之前&#xff0c;我们肯定首先需要安装java&#xff0c;首先&#xff0c;找到你安装jav…

java按钮随机移动_java – 使按钮移动触摸我们触摸的确切位置

我创建了一个应用程序,其中有一个按钮在触摸它时移动.现在对于onTouch,我实现了一个不同的类.有两个类,一个是主要的CircleMActivity.java,另一个是onTouch.现在应用程序运行正常,但有一个问题.当我点击按钮并移动它时它正在移动,但按钮和屏幕触摸之间有一个间隙.我想要的是将它…

MySQL性能优化的最佳经验

今天&#xff0c;数据库的操作越来越成为整个应用的性能瓶颈了&#xff0c;这点对于Web应用尤其明显。关于数据库的性能&#xff0c;这并不只是DBA才需要担心的事&#xff0c;而这更是我们程序员需要去关注的事情。当我们去设计数据库表结构&#xff0c;对操作数据库时&#xf…

jspstudy mysql_使用JspStudy集成环境快速部署jsp项目

标签&#xff1a;1. 安装jdk本人网盘资源&#xff1a;https://yunpan.cn/ckZLNbqxkDYYe (提取码&#xff1a;b5e8)去jdk官网下载最新的jdk: http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html2. 配置环境变量&#xff1a;1) 系统变量→新…

IOS7的蛋疼各种收集

------------------ ios7基于viewController隐藏状态条:通过ViewController重载方法返回枚举值的方法来控制状态栏的隐藏和样式。首先&#xff0c;需要在Info.plist配置文件中&#xff0c;增加键&#xff1a;UIViewControllerBasedStatusBarAppearance&#xff0c;并设置为YES&…

php java c_当PHP、Java、C、C++ 这几种编程语言变成汽车是什么样的场景?

在学习和工作中&#xff0c;人们常常会把各种编程语言拿出来做对比&#xff0c;特别是刚刚开始入门学习IT的同学。实际上&#xff0c;每门语言自己的优缺点有时候也正是语言本身的特性&#xff0c;在学习中&#xff0c;我们更应该关心的是应用场景&#xff0c;哪门语言适合哪个…

C#回顾 - 3.NET的IO:字节流

使用 Stream 类管理字节流 使用 FileStream 类管理文件数据 使用 MemoryStream 类管理内存数据 使用 BufferedSream 类提高流性能 3.1 FileStream MemoryStream Seek 定位&#xff0c;寻址 BufferedStream 3.2 管理应用程序数据 文本、流、字符串和二进制数据 管理文本数据和字…

pdftk的使用介绍

首先像下面的一页pdf&#xff0c;如果想把它分成两页&#xff0c;每一页只是一个ppt页面&#xff08;为了在kindle里读比较方便&#xff09;&#xff0c; 那么可以首先用A-pdf page cut, 将pdf 切成这样12个部分 然后我们现在要的只是第5和第8部分。 如何实现只要弟5和第8部分呢…