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;也可…

初步学习pg_control文件之八

接前文 初步学习pg_control文件之七 继续 看&#xff1a;catalog_version_no 代码如下&#xff1a; static void WriteControlFile(void) {.../** Initialize version and compatibility-check fields*/ControlFile->pg_control_version PG_CONTROL_VERSION;ControlFile-…

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

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

fork()调用使子进程先于父进程被调度

由于内核使用写时复制机制&#xff0c;fork之后父子进程是共享页表描述符的&#xff0c;如果让父进程先执行&#xff0c;那么有很大几率父进程会修改共享页表指向的数据&#xff0c;那么内核此时必须给父进程分配并复制新的页表供父进程修改使用&#xff0c;那么如果子进程被创…

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

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

文本框获取和失去焦点默认值问题

1. HTML控件<input id"txtName" type"text" value"默认值" /> <script src"script/jquery-1.7.1.min.js" type"text/javascript"></script><script type"text/javascript">$(function ()…

mac 源生安装mysql_Django执行源生mysql语句实现过程解析

1.使用extra方法解释&#xff1a;结果集修改器&#xff0c;一种提供额外查询参数的机制说明&#xff1a;依赖model模型使用方式&#xff1a;用在where后:Book.objects.filter(publisher_id"1").extra(where["titlepython学习1"])用在select后Book.objects.…

poj 3131 Cubic Eight-Puzzle 双向广搜 Hash判重

挺不错的题目&#xff0c;很锻炼代码能力和调试能力~ 题意&#xff1a;初始格子状态固定&#xff0c;给你移动后格子的状态&#xff0c;问最少需要多少步能到达&#xff0c;如果步数大于30&#xff0c;输出-1。 由于单向搜索状态太多&#xff0c;搜到二十几就会爆了&#xff0c…

mysql 优化rand_mysql优化--巧用rand(),with rollup,help__update2014.1.13

巧用rand()提取随机行&#xff1a;mysql中rand()获取0-1之间的一个随机数.这个函数和order by能把数据随机排序。随机从表中取出十条数据:select * from tablename order by rand() limit 10;此方法确实很方便&#xff0c;但是效率上却慢的惊人&#xff0c;切勿使用。SELECT * …

server2003 IIS 错误 解决

网页无法打开总显示&#xff1a;无法找到该页您正在搜索的页面可能已经删除、更名或暂时不可用。 --------------------------------------------------------------------------------请尝试以下操作&#xff1a;确保浏览器的地址栏中显示的网站地址的拼写和格式正确无误。 如…

mysql web备份软件_GitHub - toolzone/mysql_web_backup: mysql数据库自动备份,web网站自动备份shell脚本...

注意&#xff1a;Mysql_backup.sh 为 mysql 自动备份 脚本&#xff0c;配合 crontab命令 用来管理需要周期性执行任务Web_backup.sh 为 web文件 自动备份 脚本&#xff0c;配合 crontab命令 用来管理需要周期性执行任务Mysql_backup.sh 里&#xff1a;* 把 username 替换为mysq…

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

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

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

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

poj 1321 棋盘问题

题目&#xff1a; http://poj.org/problem?id1321 八皇后问题&#xff0c;用dfsj即可。 源代码&#xff1a; 1 #include <iostream>2 #include<stdio.h>3 #include<cstring>4 using namespace std;5 int a[10][10];6 int visit[10];7 int n,k,sum;8 __int64…

php mysql-proxy报错_MySQL-proxy代理导致PHP PDO::ATTR_EMULATE_PREPARES的预处理出错,MySQL报General error: 1243错误...

背景&#xff1a;用的ThinkPHP5的框架。(相比之前的3.2版本&#xff0c;版本5都用了PDO处理数据库)症状&#xff1a;SQLSTATE[HY000]: General error: 1243 Unknown prepared statement handler (1) given to mysqld_stmt_execute具体的错误SQL&#xff0c;可能是任何一条正常的…

异步分页ajax

****jsp页面代码 <% page language"java" pageEncoding"utf-8"%> <% taglib prefix"s" uri"/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or…

python函数模块_06.Python函数和模块

函数基础目标函数的快速体验函数的基本使用函数的参数函数的返回值函数的嵌套调用在模块中定义函数函数的快速体验1.1 快速体验所谓函数&#xff0c;就是把 具有独立功能的代码块 组织为一个小模块&#xff0c;在需要的时候 调用函数的使用包含两个步骤&#xff1a;定义函数 —…

浙江大学PAT上机题解析之1008. 数组元素循环右移问题 (20)

1008. 数组元素循环右移问题 (20) 时间限制 400 ms内存限制 32000 kB代码长度限制 8000 B判题程序 Standard一个数组A中存有N&#xff08;N>0&#xff09;个整数&#xff0c;在不允许使用另外数组的前提下&#xff0c;将每个整数循环向右移M&#xff08;M>0&#x…

mysql11导入数据_MySQL专题11之MySQL导出数据、MySQL导入数据

1、MySQL导出数据- MySQL中你可以使用SELECT...INTO OUTFILE语句来简单的导出数据到文本文件中。a、使用SELECT...INTO OUTFILE- 以下实例中我们将数据库runoob_tbl数据导出到/tmp/tutorials.txt文件中&#xff1a;mysql> SELECT * FROM runoob_tbl-> INTO OUTFILE /tm…

向量叉乘判断两向量之间是顺时针还是逆时针

转自http://blog.163.com/shiliping_007/blog/static/25772011201071744031933/ 向量积 a x b (^n) * |a| * |b| * sin<a, b>, 其中^n是同时垂直于a/b且符合右手定则的单位向量。若已知向量a (ax, ay, az), b (bx, by, bz); 则 a x b (ay * bz - by * az, az * bx - …