随笔 - 33, 文章 - 0, 评论 - 148, 阅读 - 92595
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

Ado.Net 实体框架学习笔记4

Posted on   ghwghw  阅读(656)  评论(0编辑  收藏  举报

这里我来总结一下我在学习过程中体会到的一些需要注意的地方:

1. 因为 ObjectQuery 实现 IQueryableIEnumerable,因此可以将 ObjectQuery 实现的查询生成器方法与 LINQ 特定的标准查询运算符方法(例如 FirstCount)结合在一起。与查询生成器方法不同,LINQ 运算符不返回 ObjectQuery

2. 当创建对象的时候尽量使用对象的静态Create方法

3. 当修改一个对象的引用对象时,千万不能直接修改该引用对象的主键,如果非要修改,可以直接给该引用对象赋新值

4.默认情况下,ObjectQuery 返回特定类型的零个或零个以上的实体对象。调用后续查询方法(例如 WhereOrderBy)将影响原始 ObjectQuery 返回的对象集合。某些方法(例如 SelectGroupBy)返回作为 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()预编译查询,不需要每次都去拼接查询字符串,只需要第一次拼接一次以后就可以直接从缓存中取得查询语句,带来性能上的提升

 

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示