我正在使用實體框架。我有一個請求列表。每個請求都有一個批准清單。當用戶登錄時,我需要找到用戶參與的請求列表(是GroupId在請求中的批准中的成員)。要確定用戶屬於哪個組,我打電話CheckGroups(groupIds)
其中groupIds是我想檢查的字符串列表,並返回用戶所屬的字符串列表。此方法相對較慢,因爲它必須進行網絡調用(這是一個Azure Active Directory圖形API調用)。此外,組id有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
如果你可以這樣做,那麼你可以使用'requests.Where(r => r.Approvals.Any(a => userGroups.Contains(a.GroupId)))''。它會容易得多。 – kat1330