实体框架获取单个项目真的很慢

本文关键字:真的 项目 单个 框架 获取 实体 | 更新日期: 2023-09-27 18:18:56

从包含6,000条记录的表中获取单个项大约需要30秒。显然,这是不可接受的,我不知道为什么。我的堆栈是。net 4.5, EF 6和Web API 2。我做的有什么明显的错误吗?

// DbSet
internal DbSet<TEntity> _dbSet;
// Ctor
public GenericRepository(TContext context)
        {
            _context = context;
            _context.Configuration.ProxyCreationEnabled = false;
            _dbSet = _context.Set<TEntity>();
        }
// Really slow method
public TEntity GetByFilter(Func<TEntity,bool> filter, params Expression<Func<TEntity, object>>[] includes)
        {
            IQueryable<TEntity> query = _dbSet;
            if (includes != null)
            {
                foreach (var include in includes)
                    query = query.Include(include);
            }
            var entity = query.Where(filter).FirstOrDefault();
            return entity;
        }
// Here's how it's called.  It returns a single item
var x = _unitOfWork.Repository.GetByFilter(i => i.WinId == id, null);

实体框架获取单个项目真的很慢

这是慢的原因是你在你的Where子句中使用link -to-objects,这意味着你在客户端(c#)而不是服务器(SQL)上执行谓词,c#正在接收6000个数据库记录,然后在内存中过滤它。

您可以看到这一点,因为您的filter参数是Func类型,这意味着您正在通过IEnumerable使用链接到对象。在扩展。

相反,你想使用的是IQueryable。其中扩展接受类型为Expression的参数。这使用了实体框架查询提供程序,因此使用了linq-to-ef。

更新你的方法签名如下:

public TEntity GetByFilter(
    Expression<Func<TEntity,bool>> filter, 
    params Expression<Func<TEntity, object>>[] includes)

下面的stackoverflow答案https://stackoverflow.com/a/793584/507793

进一步说明了这一点