工作单元 sql 查询性能下降
Unit of work sql query performance degraded
我在使用工作单元进行查询时遇到性能问题。
当我直接使用 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
扩展大卫的回答:
如果 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 表示依赖服务,用于评估当前登录的用户及其代表的租户。
我在使用工作单元进行查询时遇到性能问题。
当我直接使用 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
扩展大卫的回答:
如果 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 表示依赖服务,用于评估当前登录的用户及其代表的租户。