Entity Framework - Func引起的数据库全表查询
2015-10-19 11:09
429 查看
原文:http://www.cnblogs.com/dudu/archive/2012/04/01/enitity_framework_func.html
使用 Entity Framework 最要小心的性能杀手就是 —— 不正确的查询代码造成的数据库全表查询。
我们就遇到了一次,请看下面的示例代码:
上面代码逻辑是根据条件动态生成LINQ查询条件,将Func类型的变量作为参数传给Where方法。
实际上Where要求的参数类型是:Expression<Func<TSource, bool>>。
写代码时没注意这个问题,运行结果也正确。发布后,在SQL Server Profiler监测中,发现QuestionFeed对应的数据库表出现了全表查询,才知道这个地方的问题。
问题就是:
将Func类型的变量作为参数传给Where方法进行LINQ查询时,Enitity Framework会产生全表查询,将整个数据库表中的数据加载到内存,然后在内存中根据Where中的条件进一步查询。
解决方法:
不要用Func<TSource, bool>,用Expression<Func<TSource, bool>>。
使用 Entity Framework 最要小心的性能杀手就是 —— 不正确的查询代码造成的数据库全表查询。
我们就遇到了一次,请看下面的示例代码:
//错误的代码 Func<QuestionFeed, bool> predicate = null; if (type == 1) { predicate = f => f.FeedID == id && f.IsActive == true; } else { predicate = f => f.FeedID == id; } //_questionFeedRepository.Entities的类型为IQueryable<QuestionFeed> _questionFeedRepository.Entities.Where(predicate);
上面代码逻辑是根据条件动态生成LINQ查询条件,将Func类型的变量作为参数传给Where方法。
实际上Where要求的参数类型是:Expression<Func<TSource, bool>>。
写代码时没注意这个问题,运行结果也正确。发布后,在SQL Server Profiler监测中,发现QuestionFeed对应的数据库表出现了全表查询,才知道这个地方的问题。
问题就是:
将Func类型的变量作为参数传给Where方法进行LINQ查询时,Enitity Framework会产生全表查询,将整个数据库表中的数据加载到内存,然后在内存中根据Where中的条件进一步查询。
解决方法:
不要用Func<TSource, bool>,用Expression<Func<TSource, bool>>。
/正确的代码 Expression<Func<QuestionFeed, bool>> predicate=null; if (type == 1) { predicate = f => f.FeedID == id && f.IsActive == true; } else { predicate = f => f.FeedID == id; } _questionFeedRepository.Entities.Where(predicate);
相关文章推荐
- win8 安装mysql 5.6 64位解压缩版本
- SQL Server 2005完全卸载和安装步骤详解
- SQL Server 2005完全卸载和安装步骤详解
- IBPP链接FireBird数据库相关,总结
- oracle11g导出空表
- 构建高性能web之路------mysql读写分离实战(转)
- 数据库的读写分离(转)
- DIY一个简易查询系统
- Redis Sentinel服务配置
- [置顶] [实验-视频过程]oracle热备份-整个数据库-备份和恢复操作演示
- sql server 行转列(转载)
- 项目分布式部署那些事(1):ONS消息队列、基于Redis的Session共享,开源共享
- Redis和Memcache的区别分析(转)
- 关于在Java中oracle报ora-00911错误
- mysql 主从配置
- Oracle 多表关联更新
- ORACLE数据依赖及范式
- 连接mysql超时问题解决
- Magento根据sku查询在历史订单中的销售价格的SQL
- POSTGRESQL区域设置对索引和排序的影响