私は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;
}
の最大サイズを持っているこれは私がこれまで考えていますものです:
は- が
MyDbContext.Approvals
通過し、すべてのユニークなGroupId
のリストを取得します。 - これらのうち20を
CheckGroups()
に渡します。 - 返された文字列をリストに格納します。
- すべての一意のグループが送信されるまで、手順2と3を繰り返します。
MyDbContext.Approvals
を実行し、GroupId
が手順3のリストと一致する場合は、RequestId
をリストに追加します。ステップ5.
から、リスト内のRequestId
を持っているすべての要求の
CheckGroups()
への呼び出しがボトルネックです)。データベースが大きくなるにつれて(Requestごとに複数のApprovalsが追加されます)、これは醜くなる可能性があります。
特定のユーザーのグループを返すことはできますか? – kat1330
ああ、私はできるとは思わなかったが、私はちょうどチェックした。 CheckGroups関数(実際にはCheckMemberObjects、簡単にするために名前を変更しました)は一度に20個ですが、GetMemberObjects関数を呼び出すこともできます。この関数は、ユーザーが所属するグループのリストを2046個まで返します。私はそれが十分であるかどうかを確認する必要があるでしょう(私はそれがなると思う、2046はたくさんある)。 – vkapadia
これを行うことができれば、 'requests.Where(r => r.Approvals.Any(a => userGroups.Contains(a.GroupId)))'を使うことができます。はるかに簡単です。 – kat1330