[英]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.