最近在项止中使用EF,但项目上线后,有部分表数据达到了好几十万,发现EF加载数据的时非常的慢,具体的方法如下:
public virtual ICollection<T> FindPager<TKey>(Expression<Func<T, bool>> match, PageInfo info, Expression<Func<T, TKey>> orderByProperty, bool isDescending = true)
{
int pageindex = (info.CurrenetPageIndex < 1) ? 1 : info.CurrenetPageIndex;
int pageSize = (info.PageSize <= 0) ? 20 : info.PageSize;
int excludedRows = (pageindex - 1) * pageSize;
IQueryable<T> query = null;
if (match == null)
{
query = this.objectSet;
}
else
{
query = this.objectSet.Where(match.Compile()).AsQueryable();
}
info.RecordCount = query.Count();
if (isDescending)
{
query = query.OrderByDescending(orderByProperty).Skip<T>(excludedRows).Take<T>(pageSize);
}
else
{
query = query.OrderBy(orderByProperty).Skip<T>(excludedRows).Take<T>(pageSize);
}
return query.ToList();
}
经过调试,代码在query.count()和query.TOList()的位置会等待很久,且query.count()和query.TOList()好像是计算了两次,但是TOList后再分页会占服务器性能,是否有其它的方法?
求大神指导 EF的查询数据的优化方案和注意事项
补充:把EF生成的SQL放到数据库内执行,速度非常的快,但在程序中就非常的慢
没有大神么。。。。
难道真要整两个数据库连接,一个用EF,一个用原始的ado?
我也遇到了同样的问题 同求
查询的时候不要有or一般是sql优化问题。
检查下最终生成的sql执行语句
其实查询的条件很简章,一般都是source.where(t=>t.a==b),这样的条件,生成的SQL拿到数据库去执行,速度非常的快,但是在程序中就非常的慢,如我说的COUT和TOLIST的用了很长的时间
@beggar_: 别闹.执行慢就是sql原因.你用数据库监视看下执行的sql,就能知道原因
这个要从SQL和数据库方面去优化了。有没有索引?
只有一个主键索引
建议自己写存储过程,EF调用写的存储过程,会快一些!
return query.ToList();
改成
return query.AsNoTracking().ToList();
会不会好很多呢?
如果不使用AsNoTracking,可以考虑下按需查询.select(t=>new { })