2017-02-07 7 views
0

私はEntity Frameworkを使用しています。私はリクエストのリストを持っています。各リクエストには、承認のリストがあります。ユーザーがログインしているときに、ユーザーが関与しているリクエストのリスト(GroupIdがリクエスト内の承認内にあるグループのメンバー)を検索する必要があります。ユーザーが所属するグループを特定するには、CheckGroups(groupIds)を呼び出します。ここで、groupIdsはチェックしたい文字列のリストで、ユーザーが所属する文字列のリストを返します。このメソッドはネットワークコール(Azure Active Directory Graph 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. これらのうち20をCheckGroups()に渡します。
  3. 返された文字列をリストに格納します。
  4. すべての一意のグループが送信されるまで、手順2と3を繰り返します。
  5. MyDbContext.Approvalsを実行し、GroupIdが手順3のリストと一致する場合は、RequestIdをリストに追加します。ステップ5.

から、リスト内のRequestIdを持っているすべての要求の

  • のGetリストは本当に非効率です。これを行うより良い方法はありますか?時間を最小化しようとしています(エンティティフレームワークのデータベース呼び出しとCheckGroups()への呼び出しがボトルネックです)。データベースが大きくなるにつれて(Requestごとに複数のApprovalsが追加されます)、これは醜くなる可能性があります。

  • +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

    関連する問題