获取用户与组共享的对象列表

时间:2017-02-07 21:15:54

标签: c# entity-framework azure-active-directory

我正在使用Entity Framework。我有一份请求列表。每个请求都有一个批准列表。当用户登录时,我需要查找用户参与的请求列表(是GroupId在请求中的批准中的组成员)。为了确定用户属于哪些组,我调用CheckGroups(groupIds),其中groupIds是我要检查的字符串列表,它返回用户所属的字符串列表。此方法相对较慢,因为它必须进行网络调用(它是Azure Active Directory图谱API调用)。此外,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. 的列表
  3. 将其中的20个传递给CheckGroups()
  4. 将返回的字符串存储到列表中。
  5. 重复步骤2和3,直到发送所有唯一群组。
  6. 浏览MyDbContext.Approvals,如果GroupId与步骤3中的列表匹配,请将RequestId添加到列表中。
  7. 获取步骤5中列表中RequestId的所有请求的列表。
  8. 似乎效率很低。有一个更好的方法吗?尝试最小化时间(数据库调用实体框架和调用CheckGroups()是瓶颈)。随着数据库变得越来越大(每个请求添加多个批准的请求越多),这可能会变得很难看。

1 个答案:

答案 0 :(得分:0)

根据我的理解,网络请求对性能影响最大。特别是,您将重复该请求,直到组发送。

我还建议您先让所有群组属于用户,然后在本地比较这些群组,看看性能是否有所改善。

或者您可以考虑异步提出请求以提高网络请求的性能。