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

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

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

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

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

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

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

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

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

贴出 BaseRepository.cs 的代码

 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     }
View Code

相关文章: