1.问题的现象

 public class LinqHepler<T> where T:class
{
private EFDBContext _context = null;
/// <summary>
///
/// </summary>
/// <param name="context"></param>
public LinqHepler(EFDBContext context)
{
_context = context; }
/// <summary>
///
/// </summary>
/// <param name="whereLambda"></param>
/// <returns></returns>
public IQueryable<T> LoadEntities(Func<T, bool> whereLambda)
{
return _context.Set<T>().Where(whereLambda).AsQueryable();
}
/// <summary>
///
/// </summary>
/// <param name="whereLambda"></param>
/// <returns></returns>
public IQueryable<T> LoadEntitiesExpression(Expression<Func<T, bool>> whereLambda)
{
return _context.Set<T>().Where(whereLambda).AsQueryable();
}
}
[HttpGet]
[Route("LinqWhere")]
public IActionResult LinqWhere()
{
string uname = "";
_context.UserInfo.Where(c => c.UserName == uname).ToList();//带条件
LinqHepler<UserInfo> linqHepler = new LinqHepler<UserInfo>(_context);
linqHepler.LoadEntities(c => c.UserName == uname).ToList();//查全表
linqHepler.LoadEntitiesExpression(c => c.UserName == uname).ToList();//不查全表
return Ok();
}

生产的sql

2017-10-11T02:59:22.495010Z 2328 Query SELECT `c`.`UserId`, `c`.`UserName`, `c`.`UserPwd`
FROM `UserInfo` AS `c`
WHERE `c`.`UserName` = ''
2017-10-11T02:59:22.538041Z 2328 Query SELECT `u`.`UserId`, `u`.`UserName`, `u`.`UserPwd`
FROM `UserInfo` AS `u`
2017-10-11T02:59:22.551050Z 2328 Query SELECT `c`.`UserId`, `c`.`UserName`, `c`.`UserPwd`
FROM `UserInfo` AS `c`
WHERE `c`.`UserName` = ''

可见,第一个是用EF对象直接调用Linq的扩展方法Where可以生成对应的Where条件,

第二个用泛型传递要查学的实体类型和Where条件去查询,这时没有生产对应的Where条件的sql

第三个加了Expession类型包装Func对象有生产Where sql

参考大神的解释

园友问:EF写linq的时候,生成的SQL不带where条件,给全表都查出来的,请问这是什么原因

0
悬赏园豆:50 [已解决问题] 浏览: 575次
我用的数据仓储,我的查询linq如下:
//查询
public IQueryable<T> Query(Func<T, bool> wherelambda)
{
return db.Set<T>().AsNoTracking<T>().Where<T>(wherelambda).AsQueryable();
}
我的linq是调用该查询方法,但是通过ef sql拦截生成的SQL是全表扫描,而通过监测 sql profile生成的sql也是不带SQL

答:宏观的解释是Expression内部是专门有个解析器privoder,会根据条件解析成相应sql并执行到数据库,而Func这个破委托类型没有这种专业的sql解析器,没法生成你想要的sql,直接是等默认全表加载后在内存中筛选。

总结

框架是照超来的,结果发现有很大的问题,可能是之前检索问题的方式不对,或者是这个问题太简单了,竟然很久才找到答案,原来是linq的基础知识;

果然还是不能照抄照搬,我后来查看linq的所有方法参数中都带有这个关键字,希望对大家有帮助;

Linq To EF 用泛型时生成的Sql会查询全表的问题的更多相关文章

  1. 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效

    数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...

  2. mysql-update时where条件无索引锁全表

          1 5.3日数据处理需求 UPDATE md_meter set warranty_end_date = DATE_ADD(warranty_begin_date,INTERVAL 10 ...

  3. Linq以本周和本月为条件的Sql,Liqn查询本周,Linq查询本月

    //计算本周时间 时间 > DateTime.Now.AddDays(-Convert.ToInt32(DateTime.Now.Date.DayOfWeek) //计算本月时间 时间 > ...

  4. EF ( Entity Framework) 操作ArcCataLog 生成的(Sql Server)空间数据库

    因为项目需求,现在需要利用EF 操作由Arccatalog生成的sql server空间数据库..在此之前,一直没有接触过空间数据库,在操作空间数据库时 绕了许多弯... 因此写一篇随笔做一个总结. ...

  5. 避免SQL全表模糊查询查询 下载文件时-修改文件名字

    避免SQL全表模糊查询查询   1.模糊查询效率很低: 原因:like本身效率就比较低,应该尽量避免查询条件使用like:对于like %...%(全模糊)这样的条件,是无法使用索引的,全表扫描自然效 ...

  6. linq和EF查询的用法和区分

    我们做项目时,难免会遇到用的不知道是啥,及把linq和EF搞混了 今天我带领大家梳理下思路: 首先说linq查询,然后介绍EF查询 1.linq查询 当我们使用linq查询时,转到定义会调到Query ...

  7. C#连接Sqlite 出现:混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。的解决方案

    C#连接Sqlite 出现: 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集.的解决方案 C#连接sqlite数据库代码 ...

  8. Java进击C#——应用开发之Linq和EF

    本章简言 上一章笔者对于WinForm开发过程用到的几个知识点做了讲解.笔者们可以以此为开端进行学习.而本章我们来讲一个跟ORM思想有关的知识点.在讲之前让我们想一下关于JAVA的hibernate知 ...

  9. EF查询生成的SQL

    在EF 4和EF 3.5 SP1中,我们可以使用ToTraceString()方法得到EF查询所生成的SQL. using (var context = new TestDBEntities()) { ...

随机推荐

  1. 树莓派搭建网站wordpress的url写错 问题解决方法 有效GUI方法

    这个时候wordpress的后台已经登陆不了了,所以要对数据库做一些改变. 先说一下我是跟b站韩博士学的,LNMP.如果我们用的不一个方法的话下面就不用看了.下面是具体方法: 1  浏览器登录phpm ...

  2. Python3 执行JS出现JSON未定义问题

    two = function(e) { var t = e.data; e.url.match(/(https?:)?(\/\/)([^/]*)/) || (e.url = "https:/ ...

  3. 《Head First 设计模式》:适配器模式

    正文 一.定义 适配器模式将一个类的接口(被适配者),转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 要点: 适配器实现了目标接口,并持有被适配者的实例. 适配器使用被适配者的方 ...

  4. PowerDesigner 使用笔记

    1.将mysql数据结构导入到PowerDesigner https://blog.csdn.net/guochanof/article/details/81905616 2.设计数据库过程 http ...

  5. Solving the Distal Reward Problem through Linkage of STDP and Dopamine Signaling

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Abstract 在巴甫洛夫式和工具性条件下,奖励通常是在奖励触发动作几秒钟后产生的,从而产生了一个被称为“远端奖励问题”的解释难题:如果 ...

  6. IDEA下Maven项目搭建踩坑记----3.最长的bug,最简单的错误。同一类中,部分函数的@AutoWired注入的对象失效

    这个错误绝对是我写到现在为止最傻X的一个错误,先上图 问题: 出了一个特别长的错误,大致的意思就是mapper.xml文件注入Dao层的时候失败. 解决: 查看一下错误的位置→ 找到Dao层 找到错误 ...

  7. 兼容低版本IE浏览器的一些心得体会(持续更新)

    前言: 近期工作中,突然被要求改别人的代码,其中有一项就是兼容IE低版本浏览器,所以优雅降级吧. 我相信兼容低版本IE是许多前端开发的噩梦,尤其是改别人写的代码,更是痛不欲生. 本文将介绍一些本人兼容 ...

  8. GA教程:使用自定义变量来扩展高级细分

    http://www.wocaoseo.com/thread-64-1-1.html 您可以使用自定义变量来扩展高级细分的范围. 高级细分依据的标准是用户的会话(访问)数据.如果某个访问者在指定日期范 ...

  9. 程序员必知必会Git的小知识

    单人开发 1.初始化一个仓库 git init //cd到你工作的文件夹,初始化git仓库,默认会生成.git隐藏目录 2.配置自己的信息(Git 不喜欢不愿透漏姓名的人) git config -- ...

  10. android开发之splash闪屏页判断是否第一次进入app代码

    package com.david.david.zhankudemo.activity; import android.app.Activity; import android.content.Con ...