之前没觉得,在当文章表有5000行数据的时候,发现在本地的后台管理查询都十分慢,要5秒左右!虽然我把文字很多的正文表与主表分开的,但是视图又连接起来了。 于是用SQL Server Profiler 查看执行的sql,发现竟然执行了视图的全表扫描,select * 并且也没分页,而且还是两次!!难怪会慢。于是跟踪调试查看原因,发现在执行 IEnumerable<T> 的Count() 方法时就进行了全表扫描。EF 怎么会如此呢,经过不断地调试发现原来是因为IEnumerable<T> list=DbSet<T> 这里的问题,这里进行了个转换,肯定是EF执行这里的时候进行了全表扫描。
所以下面的方法废了。。。暂时没找到好的解决方案,用SQL代替EF了。
public static IEnumerable<T> GetList<T>(IEnumerable<T> entitys,ref GridPager pager, params Func<T, bool>[] exp) where T : class,new() { IEnumerable<T> list = entitys; if (exp != null) { foreach (Func<T, bool> ex in exp) { list = list.Where(ex); } } pager.TotalRows = list.Count(); if (!String.IsNullOrEmpty(pager.Order) && !String.IsNullOrEmpty(pager.OrderColumn)) { if (pager.Order.Equals("asc", StringComparison.CurrentCultureIgnoreCase)) { list = list.OrderByEx(pager.OrderColumn); } if (pager.Order.Equals("desc", StringComparison.CurrentCultureIgnoreCase)) { list = list.OrderByEx(pager.OrderColumn, true); } } if (pager.TotalRows > 0) { if (pager.CurrentPage <= 1) { list = list.Take(pager.PageSize); } else { list = list.Skip((pager.CurrentPage - 1) * pager.PageSize).Take(pager.PageSize); } } return list; }
还有个问题 EF 在查询的时候 DbSet<T>.Select(c=>new T{}) 的时候会报错,需要将Select这里T 变为其它类型