珂珂的个人博客 - 一个程序猿的个人网站

FYJ.Blogs查询效率问题

    之前没觉得,在当文章表有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 变为其它类型


上一篇:FYJ.Blogs开发系列(八)-自定义路由

下一篇:个人代码全部开源


0 评论

查看所有评论

给个评论吧