Производительность SQL-запросов на единицу работы снижена - PullRequest
0 голосов
/ 31 января 2019

У меня проблемы с производительностью при использовании 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 Ответ

0 голосов
/ 01 февраля 2019

Чтобы расширить ответ Дэвида:

Если 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 представляет службу зависимостей для оценки текущего вошедшего в систему пользователя и какого арендатора они представляют.

...