之前没觉得,在当文章表有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 变为其它类型
珂珂的个人博客 - 一个程序猿的个人网站