Ado.Net 实体框架学习笔记4
2010-03-18 11:30
183 查看
这里我来总结一下我在学习过程中体会到的一些需要注意的地方:
1. 因为 ObjectQuery 实现 IQueryable 和 IEnumerable,因此可以将 ObjectQuery 实现的查询生成器方法与 LINQ 特定的标准查询运算符方法(例如 First 或 Count)结合在一起。与查询生成器方法不同,LINQ 运算符不返回 ObjectQuery
2. 当创建对象的时候尽量使用对象的静态Create方法
3. 当修改一个对象的引用对象时,千万不能直接修改该引用对象的主键,如果非要修改,可以直接给该引用对象赋新值
4.默认情况下,ObjectQuery 返回特定类型的零个或零个以上的实体对象。调用后续查询方法(例如 Where 和 OrderBy)将影响原始 ObjectQuery 返回的对象集合。某些方法(例如 Select 和 GroupBy)返回作为 DbDataRecord 的数据的投影,而不是实体类型的投影。
5.当知道某个对象的键值的时候尽量使用GetObjectByKey来查找对象,不要使用linq来查找对象,因为GetObjectByKey是直接在数据源缓存中查询对象的,速度更快
6. 如果仅仅检索数据,并不需要更新数据,则可以通过使用MergeOption.NoTracking 取消变更跟踪。这样,就不会使用ObjectStateManager,减少执行查询的时间,所有返回的实体将是分离的状态(detached state)。在ASP.NET web application 或在WinForms / WPF Grids 控件中以只读方式显示数据时,NoTracking 是一个比较好的选择。在使用LINQ to Entities 或者与Entity SQL 一起使用的CreateQuery<T> 工厂方法时,不能直接传入NoTracking 选项,你需要对整个EntitySet 设置MergeOption 选项。
示例代码如下:
var categories = from c in this.context.Category
where c.ParentCategory.Name != null
orderby c.Name
select c;
context.Category.MergeOption = MergeOption.NoTracking;
return categories.ToList();
也就是说在查询完了以后再更改MergeOption是不可以的,会发生InvalidOperationException异常
7. 多用CompiledQuery.Compile()预编译查询,不需要每次都去拼接查询字符串,只需要第一次拼接一次以后就可以直接从缓存中取得查询语句,带来性能上的提升
1. 因为 ObjectQuery 实现 IQueryable 和 IEnumerable,因此可以将 ObjectQuery 实现的查询生成器方法与 LINQ 特定的标准查询运算符方法(例如 First 或 Count)结合在一起。与查询生成器方法不同,LINQ 运算符不返回 ObjectQuery
2. 当创建对象的时候尽量使用对象的静态Create方法
3. 当修改一个对象的引用对象时,千万不能直接修改该引用对象的主键,如果非要修改,可以直接给该引用对象赋新值
4.默认情况下,ObjectQuery 返回特定类型的零个或零个以上的实体对象。调用后续查询方法(例如 Where 和 OrderBy)将影响原始 ObjectQuery 返回的对象集合。某些方法(例如 Select 和 GroupBy)返回作为 DbDataRecord 的数据的投影,而不是实体类型的投影。
5.当知道某个对象的键值的时候尽量使用GetObjectByKey来查找对象,不要使用linq来查找对象,因为GetObjectByKey是直接在数据源缓存中查询对象的,速度更快
6. 如果仅仅检索数据,并不需要更新数据,则可以通过使用MergeOption.NoTracking 取消变更跟踪。这样,就不会使用ObjectStateManager,减少执行查询的时间,所有返回的实体将是分离的状态(detached state)。在ASP.NET web application 或在WinForms / WPF Grids 控件中以只读方式显示数据时,NoTracking 是一个比较好的选择。在使用LINQ to Entities 或者与Entity SQL 一起使用的CreateQuery<T> 工厂方法时,不能直接传入NoTracking 选项,你需要对整个EntitySet 设置MergeOption 选项。
示例代码如下:
var categories = from c in this.context.Category
where c.ParentCategory.Name != null
orderby c.Name
select c;
context.Category.MergeOption = MergeOption.NoTracking;
return categories.ToList();
也就是说在查询完了以后再更改MergeOption是不可以的,会发生InvalidOperationException异常
7. 多用CompiledQuery.Compile()预编译查询,不需要每次都去拼接查询字符串,只需要第一次拼接一次以后就可以直接从缓存中取得查询语句,带来性能上的提升
相关文章推荐
- Ado.Net 实体框架学习笔记2
- Ado.Net 实体框架学习笔记1
- Ado.Net 实体框架学习笔记3
- ado.net 实体框架快速入门学习
- Entity Framework 学习总结之一:ADO.NET 实体框架概述
- 继续学习 DLINQ和ADO.NET实体框架
- Entity Framework 学习总结之一:ADO.NET 实体框架概述
- Entity Framwork 学习笔记 (二) 生成 数据 ADO.NET 数据实体模型
- Entity Framework 学习总结之一:ADO.NET 实体框架概述
- Entity Framework 学习总结之一:ADO.NET 实体框架概述
- 学习WPF、WCF、实体框架及ADO.Net DataService感受
- Entity Framework 学习总结之一:ADO.NET 实体框架概述
- Entity Framework 学习总结之一:ADO.NET 实体框架概述
- ADO.NET实体框架引发争论
- 学习ASP.NET MVC5框架揭秘笔记-ASP.NET路由(六)
- ASP.NET Core 2.0系列学习笔记-ADO.NET-MSSQLServerHelper
- 黑马程序员之ADO.NET学习笔记:IP地址归属地查询。查询结果:北京移动[海淀]。
- 当年学习ADO.NET的笔记
- 黑马程序员之ADO.NET学习笔记: SqlDataAdapter(数据适配器)
- [转载]学习笔记《.NET框架程序设计(修订版)》--第一章 Microsoft .NET框架开发平台体系架构(1)