Производительность SQL-запросов на единицу работы снижена
У меня проблемы с производительностью при использовании Unit of Work для выполнения запросов.
Когда я использую DbContext напрямую, я делаю запрос linq примерно так:
var result = from x in ctx.client
select new { Name= x.name };
Когда я использую модуль, я делаю следующий код:
var result = from x in uow.GetClientRepository.GetAll()
select new { Name = x.name };
Что генерирует тип запроса SQL:
Select * from Client
Приведенный выше код будет генерировать запрос SQL типа:
Select name from Client
1 ответ
Чтобы расширить ответ Дэвида:
Если GetAll() возвращается IEnumerable<T>
, IList<T>
или подобное и выглядит примерно так:
public IEnumerable<TEntity> GetAll()
{
return _context.TEntities.ToList();
}
Тогда вы захотите изменить это на что-то вроде:
public IQueryable<TEntity> GetAll()
{
return _context.TEntities.AsQueryable();
}
В дополнение к этому, если кто-то сталкивается с этим и задается вопросом, зачем его использовать; Шаблон может быть полезен для централизации основных бизнес-правил для приложения, таких как активное состояние Soft-Delete:
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 представляет службу зависимостей для оценки текущего вошедшего в систему пользователя и того, какого арендатора они представляют.