首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架DBSet非常慢

实体框架DBSet非常慢
EN

Stack Overflow用户
提问于 2016-04-06 11:56:45
回答 1查看 1.8K关注 0票数 1

我遵循的是一个n层模式和一个服务层。没有存储层。教程是http://techbrij.com/service-layer-entity-framework-asp-net-mvc-unit-testing。我在这里的问题是,这里的GetAll()方法非常慢。运行一个简单的分页查询需要12秒。这似乎是EFs DBSet的一个问题,它是使用_context.Set<T>()方法检索的。

我的EntityService

代码语言:javascript
复制
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()方法。还有其他替代办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-06 12:15:09

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

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

代码语言:javascript
复制
public virtual IQueryable<T> GetAll()
{
    return _dbset;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36450455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档