实体框架DBSet非常慢

时间:2016-04-06 11:56:46

标签: c# entity-framework entity-framework-6

我正在使用服务层跟随n层模式。没有存储库层。教程是http://techbrij.com/service-layer-entity-framework-asp-net-mvc-unit-testing。我的问题是这里的GetAll()方法非常慢。运行简单的分页查询需要12秒。使用DBSet方法

检索EFs _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()方法。还有其他替代方案吗?

1 个答案:

答案 0 :(得分:3)

GetAll的结果类型为IEnumerable<T>时,对结果的所有查询都将导致将整个表加载到内存中,然后通过LINQ to Objects查询它。

如果您希望在数据库中执行查询(即通过LINQ to Entities),请删除AsEnumerable()来电并将GetAll类型更改为IQueryable<T>

public virtual IQueryable<T> GetAll()
{
    return _dbset;
}