我正在使用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;
}
这就是我到目前为止的想法:
MyDbContext.Approvals
并获取所有唯一GroupId
。CheckGroups()
。MyDbContext.Approvals
,如果GroupId
与步骤3中的列表匹配,请将RequestId
添加到列表中。RequestId
的所有请求的列表。似乎效率很低。有一个更好的方法吗?尝试最小化时间(数据库调用实体框架和调用CheckGroups()
是瓶颈)。随着数据库变得越来越大(每个请求添加多个批准的请求越多),这可能会变得很难看。
答案 0 :(得分:0)
根据我的理解,网络请求对性能影响最大。特别是,您将重复该请求,直到组发送。
我还建议您先让所有群组属于用户,然后在本地比较这些群组,看看性能是否有所改善。
或者您可以考虑异步提出请求以提高网络请求的性能。