工作单元SQL查询性能下降

时间:2019-01-31 18:23:52

标签: entity-framework unit-of-work

使用工作单元进行查询时,我遇到了性能问题。

当我直接使用DbContext时,我会进行linq查询,如下所示:

var result = from x in ctx.client select new { Name= x.name };

在使用Unit时,请输入以下代码:

var result = from x in uow.GetClientRepository.GetAll() select new { Name = x.name };

什么生成SQL查询类型:

Select * from Client

上面的代码将生成以下类型的SQL查询:

Select name from Client

1 个答案:

答案 0 :(得分:0)

详细介绍David的答案:

如果GetAll()返回IEnumerable<T>IList<T>之类,并且看起来像这样:

public IEnumerable<TEntity> GetAll()
{
   return _context.TEntities.ToList();
}

然后,您需要将其更改为以下内容:

public IQueryable<TEntity> GetAll()
{
   return _context.TEntities.AsQueryable();
}

此外,以防有人偶然发现并想知道为什么要使用它;该模式对于集中应用程序的核心业务规则(例如软删除活动状态)可能是有益的:

public IQueryable<TEntity> GetAll()
{
   return _context.TEntities
      .Where(x => x.IsActive);
}
// Note: AsQueryable() is not needed when the method returns IQueryable<T>

或强制执行授权,例如租约...(多个客户端访问单个云服务,预计这些数据将被隔离。)

public IQueryable<TEntity> GetAll()
{
   var tenantId = UserLocatorService.GetCurrentUserTenantId();
   return _context.TEntities
      .Where(x => x.IsActive && x.TopLevelEntity.TenantId == tenantId);
}

其中UserLocatorService表示依赖项服务,用于评估当前登录的用户及其代表的租户。