EF之贪婪加载和延迟加载
这篇文章将讨论查询结果的控制
在使用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 { get; set; } public string CategoryName { get; set; } public string Description { get; set; } public byte[] Picture { get; set; } public virtual List<Product> Products { get; set; } ... |
第二: 在context构造器中开启延迟加载功能
public NorthwindContext() : base("name=NorthwindEntities", "NorthwindEntities")
{
ContextOptions.LazyLoadingEnabled = true;
_categories = CreateObjectSet<Category>();
_products = CreateObjectSet<Product>();
}
由于集合是 POCO 的集合,所以,在访问的时候没有事件发生,EF 通过从你定义的实体派生一个动态的对象,然后覆盖你的子实体集合,通过访问属性来实现。这就是为什么需要标记你的子实体集 合属性为 virtual 的原因。
阻止延迟加载解决方案:
Tolist(),返回的东西是个内存级的对象,就是说强迫它在这里执行一次SQL语句,查询到的东西放在Web服务器内存里,这里达到了缓存的效果,从而阻止了延迟加载
EF之贪婪加载和延迟加载的更多相关文章
- 学习EF之贪婪加载和延迟加载(1)
从暑假开始接触code first以来,一直感觉很好用,主要在于开发过程中以业务为中心可以随时修改数据模型生成数据库,还有一个原因就是查询起来很方便 这里找了一个以前database first的一段 ...
- 【EfF】 贪婪加载和延迟加载 (virtual去掉关闭延迟加载)
EntityFramework(EF)贪婪加载和延迟加载的选择和使用 贪婪加载:顾名思议就是把所有要加载的东西一 次性读取 1 using (var context = new MyDbContext ...
- EntityFramework(EF)贪婪加载和延迟加载的选择和使用
贪婪加载:顾名思议就是把所有要加载的东西一 次性读取 1 using (var context = new MyDbContext()) 2 { 3 var orders = from o in co ...
- 【转】EntityFramework(EF)贪婪加载和延迟加载的选择和使用
原谅:http://www.weixq.cn/Article/Detail/906 贪婪加载:顾名思议就是把所有要加载的东西一 次性读取 using (var context = new MyDbCo ...
- EF中的贪婪加载和延迟加载(懒加载)
在上一章中,我们使用了Linq对Entity Framework进行了一个查询,但是通过学习我们却发现了懒加载给我来的性能上的开销是很到的,尤其是在循环中,如果数据量不是很多的情况下还可以接受,如果数 ...
- EF4.1之贪婪加载和延迟加载
默认情况下,EF4.1是只查询到涉及到的数据对象,但是EF4.1支持两种方法进行控制其加载: 1.贪婪加载 2.延迟加载 使用的表还是上次使用的Order 和 OrderDetails两张表来举例说明 ...
- EntityFramework 贪婪加载与延迟加载以及资源回收
EntityFramework的资源回收 1) Using 内包含Entity的上下文关系,对俩表做Add操作,最好可以直接写一个 entity.SaveChanges(); 完成两张表的同时add操 ...
- Entity Framework 4.1 : 贪婪加载和延迟加载
这篇文章将讨论查询结果的加载控制. EF4.1 允许控制对象之间的关系,当我们进行查询的时候,哪些关系的数据将会被加载到内存呢?所有相关的对象都需要吗?在一些场合可能有意义,例如,当查询的实体仅仅拥有 ...
- 学习EF之贪懒加载和延迟加载(2)
通过昨天对EF贪婪加载和延迟加载的学习,不难发现,延迟加载还是很好用的,但是问题也就来了,有的时候我们只需要加载一个实体,不需要和他相关的外部实体,这时候我们来看看EF延迟加载时怎么作用的吧 打开pr ...
随机推荐
- mysql 查看当前连接数
http://www.cnblogs.com/pcdelphi/archive/2009/10/31/2017990.html 实战经验: >登录到mysql数据库的终端 >show ...
- man gitworkflows
gitworkflows(7) Manual Page NAME gitworkflows - An overview of recommended workflows with Git SYNOPS ...
- Java、C++、Python、Ruby、PHP、C#和JavaScript的理解
Java.C++.Python.Ruby.PHP.C#和JavaScript和日本动漫里的那些大家熟悉的动漫人物结合起来.依据他们的身世.个人经历来生动的表达各编程语言的发展历程.原文内容例如以下: ...
- mysql连接超时的问题
使用Hibernate + MySQL数据库开发,链接超时问题: com.mysql.jdbc.CommunicationsException: The last packet successfull ...
- 一套Tomcat处理多个域名请求 - Virtual Host
最近和Tomcat较上劲了... 作为Tomcat的系列之一,来尝试下如何用一套Tomcat来处理多个域名请求. 场景:基于成本考虑,多个department共用一台服务器,然后该服务器上就一套Tom ...
- 关于erlang解析json数据
JSON(JavaScript Object Notation)是一种轻量级的数据交换语言,以文字为基础,且易于让人阅读.json的数据格式是文本文档格式的一种.在erlang中可以参考mochiwe ...
- linux快捷键及主要命令(转载)
作者:幻影快递Linux小组 翻译 2004-10-05 22:03:01 来自:Linux新手管理员指南(中文版) 5.1 Linux基本的键盘输入快捷键和一些常用命令 5.2 帮助命令 5.3 系 ...
- non-blocking I/O
https://en.wikipedia.org/wiki/New_I/O_(Java) zh.wikipedia.org/wiki/Java_NIO Java NIO API提供在java.nio套 ...
- appium(5)-Appium capabilities
Appium Capabilities Appium server capabilities Capability Description Values automationName Which au ...
- objective-c的代码块block
一.block 1.bock是由于^开头,括号里面填写参数类型. 标准代码块: 返回值 (^代码块名称) (参数类型) = ^(参数) {方法体}; 2.我们的块即可以定义在函数内或者对象 ...