前两年帮朋友 做了个网吧管理软件,采用动软的三层架构 sql语句生成的。最近因功能变更 要改动,而我这段正在做asp.net mvc +ef+autofac的一个电商网站。索性 就把原来的底层全重新了套用了我现在的架构 EF6.0+autofac+三层架构,上层的asp.net没有变。改完后发现交班页面打开巨慢。

跟踪EF生成的sql语句   发现生成的sql 有问题,查找的全表,而全表有近10万条的数据。

继续跟踪数据库的耗时查询 发现确实是这条语句占时间

为什么会这样呢,我在查询里做条件搜索了,为啥 结果不对呢?

贴出 BaseRepository.cs 的代码

class="code_img_closed" src="/Upload/Images/2014080923/0015B68B3C38AA5B.gif" alt="" />logs_code_hide('90546e12-ce1e-45ff-857c-4fbf39441633',event)" src="/Upload/Images/2014080923/2B1B950FA3DF188F.gif" alt="" />

 1 public class BaseRepository<T> :IDBbase<T>  where T : class
2 {
3 //实例化EF框架
4 protected skdbContext db = new skdbContext();
5
6 //添加
7 public T AddEntities(T entity)
8 {
9 db.Entry<T>(entity).State = EntityState.Added;
10 db.SaveChanges();
11 return entity;
12 }
13
14 //修改
15 public bool UpdateEntity(T entity)
16 {
17 db.Set<T>().Attach(entity);
18 db.Entry<T>(entity).State = EntityState.Modified;
19 return db.SaveChanges() > 0;
20 }
21
22 //修改
23 public bool DeleteEntities(T entity)
24 {
25 db.Set<T>().Attach(entity);
26 db.Entry<T>(entity).State = EntityState.Deleted;
27 return db.SaveChanges() > 0;
28 }
29
30 //查询
31 public IQueryable<T> LoadEntities(Func<T, bool> wherelambda)
32 {
33 return db.Set<T>().Where<T>(wherelambda).AsQueryable();
34 }
35 //查询单个
36 public T LoadEntitie(Func<T, bool> wherelambda)
37 {
38 return db.Set<T>().FirstOrDefault<T>(wherelambda);
39 }
40
41 //分页
42 public IQueryable<T> LoadPagerEntities<S>(int pageSize, int pageIndex, out int total,
43 Func<T, bool> whereLambda, bool isAsc, Func<T, S> orderByLambda)
44 {
45 var tempData = db.Set<T>().Where<T>(whereLambda);
46
47 total = tempData.Count();
48
49 //排序获取当前页的数据
50 if (isAsc)
51 {
52 tempData = tempData.OrderBy<T, S>(orderByLambda).
53 Skip<T>(pageSize * (pageIndex - 1)).
54 Take<T>(pageSize).AsQueryable();
55 }
56 else
57 {
58 tempData = tempData.OrderByDescending<T, S>(orderByLambda).
59 Skip<T>(pageSize * (pageIndex - 1)).
60 Take<T>(pageSize).AsQueryable();
61 }
62 return tempData.AsQueryable();
63 }
64 }

调用代码

return jiaobanitem.LoadEntities(t => t.JiaoBanID == jiaobanID && t.GoodsID == GoodsID).FirstOrDefault();

参考 nopCommerce  修改baserepository

  1 public class EFRepository<T> : IRepository<T> where T : class
2 {
3 //实例化EF框架
4 //protected YaFeiNetContext db = new YaFeiNetContext();
5 private DbContext _context;
6 private IDbSet<T> _entities;
7
8 public EFRepository(DbContext context)
9 {
10 this._context = context;
11 }
12
13
14 //添加
15 public virtual T AddEntities(T entity)
16 {
17 try
18 {
19 if(entity==null)
20 throw new ArgumentNullException("entity");
21
22 this.Entities.Add(entity);
23 this._context.SaveChanges();
24 return entity;
25 }
26 catch(DbEntityValidationException dbEx)
27 {
28 var msg = string.Empty;
29 foreach(var validationErrors in dbEx.EntityValidationErrors)
30 foreach (var validationError in validationErrors.ValidationErrors)
31 msg += string.Format("Property:{0} Error:{1}", validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine ;
32
33 var fail = new Exception(msg,dbEx);
34 throw fail;
35 }
36 }
37
38 //修改
39 public virtual bool UpdateEntities(T entity)
40 {
41 try
42 {
43 if (entity == null)
44 throw new ArgumentNullException("entity");
45
46
47 // this.Entities.Attach(entity);
48 // _context.Entry<T>(entity).State = EntityState.Modified;
49 return this._context.SaveChanges() > 0;
50 }
51 catch (DbEntityValidationException dbEx)
52 {
53 var msg = string.Empty;
54 foreach (var validationErrors in dbEx.EntityValidationErrors)
55 foreach (var validationError in validationErrors.ValidationErrors)
56 msg += string.Format("Property:{0} Error:{1}", validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine;
57
58 var fail = new Exception(msg, dbEx);
59 throw fail;
60 }
61
62 }
63
64 //修改
65 public virtual bool DeleteEntities(T entity)
66 {
67 try
68 {
69 if (entity == null)
70 throw new ArgumentNullException("entity");
71
72 //db2.Set<T>().Attach(entity);
73 //db2.Entry<T>(entity).State = EntityState.Deleted;
74 this.Entities.Remove(entity);
75 return this._context.SaveChanges() > 0;
76 }
77 catch (DbEntityValidationException dbEx)
78 {
79 var msg = string.Empty;
80 foreach (var validationErrors in dbEx.EntityValidationErrors)
81 foreach (var validationError in validationErrors.ValidationErrors)
82 msg += string.Format("Property:{0} Error:{1}", validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine;
83
84 var fail = new Exception(msg, dbEx);
85 throw fail;
86 }
87
88
89 }
90
91 //查询
92 public virtual IQueryable<T> LoadEntities(Func<T, bool> wherelambda)
93 {
94 return this.Entities.Where<T>(wherelambda).AsQueryable();
95 }
96 //查询单个
97 public virtual T LoadEntitie(Func<T, bool> wherelambda)
98 {
99 return this.Table.Where(wherelambda).FirstOrDefault();
100 }
101 /// <summary>
102 /// 根据主键查找
103 /// </summary>
104 /// <param name="id"></param>
105 /// <returns></returns>
106 public virtual T GetById(object id)
107 {
108 return this.Entities.Find(id);
109 }
110
111
112
113
114 //分页
115 public virtual IQueryable<T> LoadPagerEntities<S>(int pageSize, int pageIndex, out int total,
116 Func<T, bool> whereLambda, bool isAsc, Func<T, S> orderByLambda)
117 {
118
119 var tempData = this.Entities.Where<T>(whereLambda);
120
121 total = tempData.Count();
122
123 //排序获取当前页的数据
124 if (isAsc)
125 {
126 tempData = tempData.OrderBy<T, S>(orderByLambda).
127 Skip<T>(pageSize * (pageIndex - 1)).
128 Take<T>(pageSize).AsQueryable();
129 }
130 else
131 {
132 tempData = tempData.OrderByDescending<T, S>(orderByLambda).
133 Skip<T>(pageSize * (pageIndex - 1)).
134 Take<T>(pageSize).AsQueryable();
135 }
136 return tempData.AsQueryable();
137
138
139
140 }
141
142 protected virtual IDbSet<T> Entities
143 {
144 get
145 {
146 if (_entities == null)
147 _entities = _context.Set<T>();
148 return _entities;
149 }
150 }
151
152
153 public virtual IQueryable<T> Table
154 {
155 get { return this.Entities; }
156 }
157
158
159 }

同时修改调用代码 为

return jiaobanitem.Table.Where(t=>t.JiaoBanID ==jiaobanID && t.GoodsID ==GoodsID).FirstOrDefault();

问题解决 页面响应不到100ms   同时调试中 生成的sql语句已经有 查询条件了

问题出在

//查询
public IQueryable<T> LoadEntities(Func<T, bool> wherelambda)
{
  return db.Set<T>().Where<T>(wherelambda).AsQueryable();
}

为了验证,我在前台直接调用

return this.context.Set<tb_e_jiaoBanItem>().Where(t =>
t.JiaoBanID == jiaobanID && t.GoodsID ==
GoodsID).AsQueryable().FirstOrDefault();

页面响应也是 100ms左右,性能没问题。直接调用 dbcontext的set<>方法 没问题。但跨了几层传递后 就有问题。并没有生成我想要的查询语句

解决 EF 分层查询的一个性能问题[转]的更多相关文章

  1. 解决 EF where<T>(func) 查询的一个性能问题

    前两年帮朋友 做了个网吧管理软件,采用动软的三层架构 sql语句生成的.最近因功能变更 要改动,而我这段正在做asp.net mvc +ef+autofac的一个电商网站.索性 就把原来的底层全重新了 ...

  2. 《Entity Framework 6 Recipes》中文翻译系列 (40) ------ 第七章 使用对象服务之从跟踪器中获取实体与从命令行生成模型(想解决EF第一次查询慢的,请阅读)

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-5  从跟踪器中获取实体 问题 你想创建一个扩展方法,从跟踪器中获取实体,用于数 ...

  3. 第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题

    一. 开篇说明 EF的性能问题一直以来经常被人所吐槽,究其原因在于“复杂的操作在生成SQL阶段耗时长,且执行效率不高”,但并不是没有办法解决,从EF本身举几个简单的优化例子: ①:如果仅是查询数据,并 ...

  4. 讨论过后而引发对EF 6.x和EF Core查询缓存的思考

    前言 最近将RabbitMQ正式封装引入到.NET Core 2.0项目当中,之前从未接触过是个高大上的东东跟着老大学习中,其中收获不少,本打算再看看RabbitMQ有时间写写,回来后和何镇汐大哥探讨 ...

  5. .NET Core使用EF分页查询数据报错:OFFSET语法错误问题

    在Asp.Net Core MVC项目中使用EF分页查询数据时遇到一个比较麻烦的问题,系统会报如下错误: 分页查询代码: ) * condition.PageSize).Take(condition. ...

  6. 匿名类型 使用泛型T linq返回dynamic类型的匿名实体 如何把匿名类型.GetType()返回的对象传进泛型里面 EF实体查询出的数据List<T>转DataTable出现【DataSet 不支持 System.Nullable<>】的问题

    [100分]紧急求助:LinQ下使用IQueryable<T>如何将返回类型<T>使用匿名类型 问题描述如下:我有一个方法如下:public IQueryable Dissen ...

  7. 用EF DataBase First做一个简单的MVC3报名页面

    使用EF DataBase First做一个简单的MVC3报名网站 ORM(Object Relational Mapping)是面向对象语言中的一种数据访问技术,在ASP.NET中,可以通过ADO. ...

  8. EF 数据查询效率对比

    优化的地方: 原地址:https://www.cnblogs.com/yaopengfei/p/9226328.html ①:如果仅是查询数据,并不对数据进行增.删.改操作,查询数据的时候可以取消状态 ...

  9. ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 使用 EF 框架查询数据 上一章节我们学习了如何设置 ...

随机推荐

  1. IE专用CSS,最全的CSS hack方式一览

    http://blog.csdn.net/freshlover/article/details/12132801

  2. 使用jQuery.FileUpload插件和Backload组件裁剪上传图片

    □ 思路 1.自定义控制器继承Backload的默认控制器BackloadController2.自定义一个jQuery File Upload初始化js文件,使用自定义控制器的方法3.在视图页面调用 ...

  3. css3的3D翻牌效果

    利用hover控制动画,一个从翻面向正面翻,一个从正面向反面翻. 利用:backface-visibility: hidden;控制反面的元素不显示. 不支持的浏览器直接切换层级换图. <!DO ...

  4. TP框架多上传域上传图片

    问题: 学习使用TP框架做电商网站是,添加商品表单需要上传商品logo和商品图片pics,有两个上传域,第一个上传域是logo,只上传一张,第二个上传域是pics,上传多张图片.使用如下代码,总是报错 ...

  5. PS学习笔记

    PS学习笔记 常用快捷键 快捷键 功能 Ctrl+T 自由变换 Ctrl+Alt+Shift+T 复制图层+再次变换 Alt+Del 以前景色填充 Ctrl+Del 以背景色填充 Ctrl+I 反相 ...

  6. C# 启动进程和杀死进程

    /// <summary> /// 杀死进程 /// </summary> private void KillProcesses() { var cfn = GetAppset ...

  7. Jquer学习

    1:什么是Jquery 2:jquery的例子 3:后记

  8. [BZOJ 4033] [HAOI2015] T1 【树形DP】

    题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...

  9. 1008: [HNOI2008]越狱

    n个人,m种信仰: 问你相邻的人信仰不同的情况有多少种? 首先第一个人有m种选择,第二个人有m-1种选择,后面所有的人都只有m-1种选择: 所以结果就是m^n-m*(m-1)^(n-1) #inclu ...

  10. HDU 2985 Another lottery(坑题)

    点我看题目 题意 : 有n个人,每个人可以玩m轮,每一轮中每个参与者都有cj张票,第 i 轮的奖金是2的i次方,问你每个人所能赢得最多的奖金的概率是多少. 思路 : 这个题比较坑啊,其实不用去算前几轮 ...