2017-02-07 8 views
0

Я использую Entity Framework. У меня есть список запросов. Каждый запрос имеет список утверждений. Когда пользователь вошел в систему, мне нужно найти список запросов, в которых участвует пользователь (является членом группы, у которой GroupId находится в утверждении в запросе). Чтобы выяснить, к каким группам принадлежит пользователь, я вызываю CheckGroups(groupIds) где groupIds - это список строк, которые я хочу проверить, и он возвращает список строк, к которым принадлежит пользователь. Этот метод относительно медленный, так как он должен выполнить сетевой вызов (это вызов API графического интерфейса Azure Active Directory). Кроме того, groupIds имеет максимальный размер 20.Получить список объектов, которыми владеет пользователь с помощью

public class MyDbContext : DbContext 
{ 
    public virtual DbSet<Request> Requests; 
    public virtual DbSet<Approval> Approvals; 
} 

public class Request 
{ 
    public int RequestId; 
    // several irrelevant properties 
    public virtual ICollection<Approval> Approvals; 
} 

public class Approval 
{ 
    public int ApprovalId; 
    public int RequestId; 
    // several irrelevant properties 
    public string GroupId; 
} 

Это то, что я имею в виду до сих пор:

  1. Пройдите MyDbContext.Approvals и получите список всех уникальных GroupId.
  2. Пройдите 20 из них до CheckGroups().
  3. Хранить возвращенные строки в список.
  4. Повторите шаги 2 и 3, пока не будут отправлены все уникальные группы.
  5. Пройдите MyDbContext.Approvals, и если GroupId соответствует списку с шага 3, добавьте RequestId в список.
  6. Получить список всех запросов, которые в списке на RequestId с шага 5.

Кажется очень неэффективно. Есть лучший способ сделать это? Попытка минимизировать время (вызовы базы данных для инфраструктуры сущностей и звонки на CheckGroups() являются узкими местами). По мере увеличения базы данных (больше запросов добавлено с несколькими одобрениями на запрос) это может стать уродливым.

+0

Можете ли вы вернуть группы для определенного пользователя? – kat1330

+0

Ах, я не думаю, что мог, но я только что проверил, и похоже, что могу. Функция CheckGroups (на самом деле CheckMemberObjects, я просто переименовал ее для простоты) занимает 20 за раз, но я также могу вызвать функцию GetMemberObjects, которая вернет список групп, к которому принадлежит пользователь, до 2046 из них. Мне нужно проверить, достаточно ли этого (я подозреваю, что это будет, 2046 - это много). – vkapadia

+0

Если вы можете это сделать, вы можете использовать 'request.Where (r => r.Approvals.Any (a => userGroups.Contains (a.GroupId))). Это будет намного проще. – kat1330

ответ

0

Основываясь на моем понимании, сетевой запрос оказывает наибольшее влияние на производительность. Тем более, что вы повторите запрос до отправки групп.

Я также предлагаю вам сначала получить все группы, принадлежащие пользователям, затем сравнить локальные группы, чтобы узнать, улучшена ли производительность.

Или вы можете запросить асинхронный запрос, чтобы повысить производительность сетевого запроса.

+0

Я сделал вашу идею. Получил все группы (я не думал, что есть способ сделать это, но я нашел вызов) и сравнивал локально. благодаря! – vkapadia

 Смежные вопросы

  • Нет связанных вопросов^_^