原文:http://www.cnblogs.com/dudu/archive/2012/04/01/enitity_framework_func.html

使用 Entity Framework 最要小心的性能杀手就是 —— 不正确的查询代码造成的数据库全表查询。

我们就遇到了一次,请看下面的示例代码:

  1. //错误的代码
  2. Func<QuestionFeed, bool> predicate = null;
  3. if (type == 1)
  4. {
  5. predicate = f => f.FeedID == id && f.IsActive == true;
  6. }
  7. else
  8. {
  9. predicate = f => f.FeedID == id;
  10. }
  11. //_questionFeedRepository.Entities的类型为IQueryable<QuestionFeed>
  12. _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>>。

  1. /正确的代码
  2. Expression<Func<QuestionFeed, bool>> predicate=null;
  3. if (type == 1)
  4. {
  5. predicate = f => f.FeedID == id && f.IsActive == true;
  6. }
  7. else
  8. {
  9. predicate = f => f.FeedID == id;
  10. }
  11. _questionFeedRepository.Entities.Where(predicate);

  

Entity Framework - Func引起的数据库全表查询的更多相关文章

  1. 用Entity Framework 来创建MySql数据库和表结构

    1. 创建VS工程 2.添加新项, 选中ADO.Net Entity Data Model模板 3.填入Host及数据库名字, 如果没有此数据库, 会提示创建 4.添加edmx后, 右击选择属性,配置 ...

  2. Entity Framework Core的坑:Skip/Take放在Select之前造成Include的实体全表查询

    今天将一个迁移至 ASP.NET Core 的项目放到一台 Linux 服务器上试运行.站点启动后,浏览器打开一个页面一直处于等待状态.接着奇怪的事情发生了,整个 Linux 服务器响应缓慢,ssh命 ...

  3. Entity Framework Code First 在Object Join Linq查询时出现全表查询的语句。

    最近一个项目,使用微软的Entity Framework的ORM框架的项目,部署到现场后,出现了系统缓慢,多个客户端的内存溢出崩溃的问题. 打开了SQL Server Profiler(SQL Ser ...

  4. 使用Entity Framework Core需要注意的一个全表查询问题

    .NET Core 迁移工作如火如荼,今天在使用 Entity Frameowork Core(又名EF Core)时写了下面这样的 LINQ 查询表达式: .Where(u => u.Id = ...

  5. Mariadb/MySQL数据库单表查询基本操作及DML语句

    Mariadb/MySQL数据库单表查询基本操作及DML语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一数据库及表相关概述 1>.数据库操作 创建数据库: CREATE ...

  6. Vc数据库编程基础MySql数据库的表查询功能

    Vc数据库编程基础MySql数据库的表查询功能 一丶简介 不管是任何数据库.都会有查询功能.而且是很重要的功能.上一讲知识简单的讲解了表的查询所有. 那么这次我们需要掌握的则是. 1.使用select ...

  7. 让EF飞一会儿:如何用Entity Framework 6 连接Sqlite数据库

    获取Sqlite 1.可以用NuGet程序包来获取,它也会自动下载EF6 2.在Sqlite官网上下载对应的版本:http://system.data.sqlite.org/index.html/do ...

  8. 如何用Entity Framework 6 连接Sqlite数据库[转]

    获取Sqlite 1.可以用NuGet程序包来获取,它也会自动下载EF6 2.在Sqlite官网上下载对应的版本:http://system.data.sqlite.org/index.html/do ...

  9. ASP.NET MVC+Entity Framework 4.1访问数据库

    Entity Framework 4.1支持代码优先(code first)编程模式:即可以先创建模型类,然后通过配置在EF4.1下动态生成数据库. 下面演示两种情形: 1.代码优先模式下,asp.n ...

随机推荐

  1. datagrid的基本操作-增删改

    1 ---恢复内容开始--- <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  2. 1:scrapy框架原理与环境搭设

    1:原理图: (*此图来自网络) 2:开发过程: 1)编写items.py,确定要抓取的关键字段名称 2)编写spider,确定发送request的形式以及对于response的处理 3)编写pipe ...

  3. ASP.Net用jQuery ajax实现页面局部刷新

    刚开始的时候使用asp的updatepanel控件实现局部刷新,而且在本地运行正确,但是部署到服务器上就变成整个页面全部刷新了.服务器用的是Windows server2000,本地机子上用的是win ...

  4. centos上如何安装git

    安装依赖包 1.yum -y install zlib-devel openssl-devel perl cpio expat-devel gettext-devel 2.yum install au ...

  5. MySQL sql 执行步骤

    基本步骤是  1.from  2.join on  3.where  4.group by  5.having  6.order by  7.select  8.distinct ,sum,...  ...

  6. java下io文件切割合并功能加配置文件

    package cn.stat.p1.file; import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...

  7. C#double保留两位小数

    public static void Main(string[] args) { double db = Math.PI; db = Math.Round(db,); Console.WriteLin ...

  8. Java系列--第三篇 基于Maven的Android开发CAIO

    学习要打好基础,这里用一个项目来学习一下Android的组件,参考网址为这个但不限于这个.有些东西的学习,理解三遍理论还不如一遍操作,所谓理论来自实践,实践是检验真理的唯一标准.所以,虽然看懂了那篇文 ...

  9. 在Web开发方面Java跟PHp八大对比

    在Web开发方面Java跟PHp八大对比 <本文摘自百度经验,用来简单对比一下这两种语言> 一. 语言比较 PHP是解释执行的服务器脚本语言,首先php有简单容易上手的特点.语法和c语言比 ...

  10. 分数相加减的代码(c++)

    #include <iostream> using namespace std; int gy(int a,int k1) {int min; if(a>k1)min=k1; els ...