我正在使用服务层跟随n层模式。没有存储库层。教程是http://techbrij.com/service-layer-entity-framework-asp-net-mvc-unit-testing。我的问题是这里的GetAll()
方法非常慢。运行简单的分页查询需要12秒。使用DBSet
方法
_context.Set<T>()
似乎是一个问题
我的实体服务
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
已过时且对我们来说也很慢。
我们访问的表有大约300,000条记录,但我们使用分页来帮助查询和方便用户访问。无论如何,为了测试对_context.Set<T>()
的调用速度慢,我跳过了服务并在控制器中运行我的上下文来运行完全相同的查询。查询花了不到一秒钟。
有谁知道为什么会这样或有办法加快速度?我想我可能不得不避免使用set()方法。还有其他替代方案吗?
答案 0 :(得分:3)
当GetAll
的结果类型为IEnumerable<T>
时,对结果的所有查询都将导致将整个表加载到内存中,然后通过LINQ to Objects查询它。
如果您希望在数据库中执行查询(即通过LINQ to Entities),请删除AsEnumerable()
来电并将GetAll
类型更改为IQueryable<T>
:
public virtual IQueryable<T> GetAll()
{
return _dbset;
}