2017-02-07 34 views
0

我正在使用實體框架。我有一個請求列表。每個請求都有一個批准清單。當用戶登錄時,我需要找到用戶參與的請求列表(是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; 
} 

一個最大尺寸這是我至今想:

  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

如果你可以這樣做,那麼你可以使用'requests.Where(r => r.Approvals.Any(a => userGroups.Contains(a.GroupId)))''。它會容易得多。 – kat1330

回答

0

根據我的理解,網絡請求對性能影響最大。特別是,你會重複請求,直到發送組。

我還建議你先把所有的用戶組歸屬於用戶,然後在本地比較這些用戶組,以查看性能是否有所提高。

或者您可以考慮異步提出請求以提高網絡請求的性能。

+0

我做了你的主意。得到所有團體(我不認爲有辦法做到這一點,但我確實找到了一個電話),並在當地進行比較。謝謝! – vkapadia