簡體   English   中英

實體框架DBSet非常慢

[英]Entity Framework DBSet is extremely slow

我遵循帶有服務層的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已過時並且對我們也很慢。

我們正在訪問的表大約有300,000條記錄,但是我們使用分頁來幫助查詢並簡化用戶的訪問。 無論如何,為了測試_context.Set<T>()的調用是否緩慢,我跳過了該服務,並在控制器中運行了上下文以運行完全相同的查詢。 查詢用了不到一秒鍾的時間。

有誰知道為什么會這樣或有辦法加快速度? 我在想可能要避免使用set()方法。 還有其他選擇嗎?

GetAll的結果類型為IEnumerable<T> ,對結果的所有查詢將導致將整個表加載到內存中,然后通過LINQ將其查詢到Objects。

如果要在數據庫上執行查詢(即通過LINQ到Entities),請刪除AsEnumerable()調用,並將GetAll類型更改為IQueryable<T>

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM