Я использую 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;
}
Это то, что я имею в виду до сих пор:
- Пройдите
MyDbContext.Approvals
и получите список всех уникальныхGroupId
. - Пройдите 20 из них до
CheckGroups()
. - Хранить возвращенные строки в список.
- Повторите шаги 2 и 3, пока не будут отправлены все уникальные группы.
- Пройдите
MyDbContext.Approvals
, и еслиGroupId
соответствует списку с шага 3, добавьтеRequestId
в список. - Получить список всех запросов, которые в списке на
RequestId
с шага 5.
Кажется очень неэффективно. Есть лучший способ сделать это? Попытка минимизировать время (вызовы базы данных для инфраструктуры сущностей и звонки на CheckGroups()
являются узкими местами). По мере увеличения базы данных (больше запросов добавлено с несколькими одобрениями на запрос) это может стать уродливым.
Можете ли вы вернуть группы для определенного пользователя? – kat1330
Ах, я не думаю, что мог, но я только что проверил, и похоже, что могу. Функция CheckGroups (на самом деле CheckMemberObjects, я просто переименовал ее для простоты) занимает 20 за раз, но я также могу вызвать функцию GetMemberObjects, которая вернет список групп, к которому принадлежит пользователь, до 2046 из них. Мне нужно проверить, достаточно ли этого (я подозреваю, что это будет, 2046 - это много). – vkapadia
Если вы можете это сделать, вы можете использовать 'request.Where (r => r.Approvals.Any (a => userGroups.Contains (a.GroupId))). Это будет намного проще. – kat1330