我遵循的是一个n层模式和一个服务层。没有存储层。教程是http://techbrij.com/service-layer-entity-framework-asp-net-mvc-unit-testing。我在这里的问题是,这里的GetAll()方法非常慢。运行一个简单的分页查询需要12秒。这似乎是EFs DBSet的一个问题,它是使用_context.Set<T>()方法检索的。
我的EntityService
public class EntityService<T> : IEntityService<T> where T : BaseEntity
{
protected GraphicContext _context;
protected DbSet<T> _dbset;
public EntityService(GraphicContext context)
{
_context = context;
_dbset = _context.Set<T>();
}
public virtual async Task CreateAsync(T entity)
{
if (entity == null)
{
throw new ArgumentNullException("entity");
}
_dbset.Add(entity);
await _context.SaveChangesAsync();
}
public virtual async Task<T> FindAsync(params object[] keyValues)
{
if (keyValues == null)
{
throw new ArgumentNullException("id");
}
return await _dbset.FindAsync(keyValues);
}
public virtual async Task UpdateAsync(T entity)
{
if (entity == null) throw new ArgumentNullException("entity");
_context.Entry(entity).State = System.Data.Entity.EntityState.Modified;
await _context.SaveChangesAsync();
}
public virtual async Task DeleteAsync(T entity)
{
if (entity == null) throw new ArgumentNullException("entity");
_dbset.Remove(entity);
await _context.SaveChangesAsync();
}
public virtual IEnumerable<T> GetAll()
{
return _dbset.AsEnumerable<T>();
}
}它之所以使用DBSet,是因为经过一些研究之后,IDBSet已经过时了,而且对我们来说速度也很慢。
我们正在访问的表有大约30万条记录,但是我们使用分页来帮助查询和方便用户访问。无论如何,为了测试对_context.Set<T>()的调用是否慢,我跳过了服务,并在控制器中运行上下文来运行完全相同的查询。查询所用的时间不到一秒钟。
有没有人知道为什么会这样,或者有办法加快速度?我想我可能不得不避免使用set()方法。还有其他替代办法吗?
发布于 2016-04-06 12:15:09
当GetAll的结果类型为IEnumerable<T>时,对结果的所有查询都将导致在内存中加载整个表,然后通过LINQ对象进行查询。
如果您希望在数据库中执行查询(即通过LINQ实体),请删除AsEnumerable()调用并将GetAll类型更改为IQueryable<T>
public virtual IQueryable<T> GetAll()
{
return _dbset;
}https://stackoverflow.com/questions/36450455
复制相似问题