最新消息:把Logo换了一下,虽然丑了点,但至少完全是自己的设计

Entity FrameWork中的查询性能(内存)优化

CSharp 宇托 1012浏览 暂无评论

最近做一个项目用了Entity FrameWork。因为数据量比较大,所以必须要分批查询。但把代码写好一看,使用分批查询,执行到最后内存的使用量居然也达到了一个G左右,这决对不正常。

在网上找了一堆的资料,但基本上没有找到解决方法,后面的微软的网站上看Entity FrameWork的介绍,才发现Entity FrameWork有更改跟踪的功能。我的直觉告诉我很可能是这个的问题。

在项目里,查询这一块只是用来输出文件,不需要对数据库做任何修改,所以我试着关闭了更改跟踪的功能。发现内存降到80M左右,基本上不再上升。呵呵,问题解决。

关闭更改跟踪功能很简单,在查询语句中加上.AsNoTracking()就行。

如下代码(微软的例子)

C#
// 在使用 DbContext 时禁用对查询的更改跟踪
var productsForCategory = from p in context.Products.AsNoTracking()
                            where p.Category.CategoryName == selectedCategory
                            select p;

// 使用 ObjectContext 在查询层面上禁用更改跟踪
var productsForCategory = from p in context.Products
                            where p.Category.CategoryName == selectedCategory
                            select p;

((ObjectQuery)productsForCategory).MergeOption = MergeOption.NoTracking;

// 使用 ObjectContext 禁用对整个实体集的更改跟踪
context.Products.MergeOption = MergeOption.NoTracking;

var productsForCategory = from p in context.Products
                            where p.Category.CategoryName == selectedCategory
                            select p;

根据我的测试,如果查询次数比较多的情况下,关闭更改跟踪功能能很大程度上改善对内存的使用。当然,如果只是一次查询,那对于内存上的改善不多。


参考地址:实体框架 5 性能注意事项 中的【5 NoTracking 查询】

转载请注明:宇托的狗窝 » Entity FrameWork中的查询性能(内存)优化

发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址