zoukankan      html  css  js  c++  java
  • EF查询性能优化(一)

    其实我们经常用到.多条件查询名字等功能..如果有名字就查询这个名字.没有就是全部数据..

    因为不能直接使用tolist()会读取到数据库数据..正常查询时候 为了不直接读取数据库.只是先留个空壳.我们会这么写.

    1. var TasksPL = from ta in db.JF_Tasks select ta;
    2.  
      if (EMRealName != null)
    3.  
      {
    4.  
      TasksPL = TasksPL.Where(s => s.Executor == EMRealName || s.TestEmployee == EMRealName || s.DemandEmployee == EMRealName);
    5.  
       
    6.  
      }
    7.  
      if (!string.IsNullOrEmpty(FinishStatus))
    8.  
      {
    9.  
      TasksPL = TasksPL.Where(s => s.FinishStatus == FinishStatus);
    10.  
       
    11.  
      }
    12.  
      if (!string.IsNullOrEmpty(TaskNeeds))
    13.  
      {
    14.  
      TasksPL = TasksPL.Where(s => s.TaskNeeds.Contains(TaskNeeds));
    15.  
      }

    这也是我用了很久的方法..

    直到今天.我就想Linq难到没有自己的方法吗..我就各种查询...找到了

     var TasksPL = db.JF_Tasks.AsQueryable();
    var TasksPL2 = db.JF_Tasks.AsEnumerable();

    这两种写法...然后..又百度了一下.这两个方法的区别.IQueryable实现了IEnumberable接口。但IEnumerable<T> 换成IQueryable<T>后速度提高很多。原因:
    IQueryable接口与IEnumberable接口的区别:  IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable<T> 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令,它并不是把所有数据都加载到内存里来才进行条件过滤。

    非常高兴.经过测试之后发现.200条数据...AsQueryable()方法.比原来最初写的lambda方法.速度快了100多倍...以后终于可以这么写了:

    1. var TasksPL = db.JF_Tasks.AsQueryable();
    2.  
      //var TasksPL = from ta in db.JF_Tasks select ta;
    3.  
      if (!string.IsNullOrEmpty(sTime) && !string.IsNullOrEmpty(eTime))
    4.  
      {
    5.  
      DateTime dsTime = Convert.ToDateTime(sTime);
    6.  
      DateTime deTime = Convert.ToDateTime(eTime).AddDays(1);
    7.  
      TasksPL = TasksPL.Where(s => s.CreatedOn >= dsTime && s.CreatedOn <= deTime);
    8.  
      }
    9.  
      if (EMRealName != null)
    10.  
      {
    11.  
      TasksPL = TasksPL.Where(s => s.Executor == EMRealName || s.TestEmployee == EMRealName || s.DemandEmployee == EMRealName);
    12.  
      }
    13.  
      if (!string.IsNullOrEmpty(FinishStatus))
    14.  
      {
    15.  
      TasksPL = TasksPL.Where(s => s.FinishStatus == FinishStatus);
    16.  
      }
    17.  
      if (!string.IsNullOrEmpty(TaskNeeds))
    18.  
      {
    19.  
      TasksPL = TasksPL.Where(s => s.TaskNeeds.Contains(TaskNeeds));
    20.  
      }

    最后使用的时候在ToList().

  • 相关阅读:
    spring mvc DispatcherServlet详解之一---处理请求深入解析
    spring mvc DispatcherServlet详解之前传---前端控制器架构
    [推荐]趣味剖析Spring5核心原理
    源码揭秘mybatis日志实现的原理
    mybatis返回自增主键踩坑记
    根据身份证号码判定原籍地的方法
    深入源码解析spring aop实现的三个过程
    匆忙--一个大龄十年老程序员战战兢兢的应对中年危机的2019年总结与2020年展望
    Java 趟坑录
    迷你MVVM框架 avalonjs1.5 入门教程
  • 原文地址:https://www.cnblogs.com/weihengblogs/p/13613349.html
Copyright © 2011-2022 走看看