Heute haben wir derzeit eine Aussage wie diese:
var Query = (from dp in db.Patients
select dp);
var UserID = User.Identity.GetUserId();
if (User.IsInRole("Administrator"))
{
Query = Query.Where(x => x.AdministratorID == UserID);
}
if (User.IsInRole("Counselor"))
{
Query = Query.Where(x => x.CounselorID == UserID);
}
if (User.IsInRole("Physician"))
{
Query = Query.Where(x => x.PhysicianID == UserID);
}
Das Problem ist, dass wir Benutzer haben, die mehrere Rollen haben können. Wenn ein Benutzer sowohl Berater als auch Arzt ist, soll das System alle Patienten zurückziehen, bei denen CounselorID == UserID oder PhysicianID == UserID.
Wie kann dies dynamisch erreicht werden, wenn wir nicht wissen, welche Rolle ein Benutzer beim Laden der Seite spielen wird?
Die aktuelle .Where-Klausel verwendet nur eine AND- Anweisung. Wir benötigen eine OR- Anweisung.
Idealerweise gibt es eine Lösung wie diese:
if (User.IsInRole("Administrator"))
{
Query = Query.Where(x => x.AdministratorID == UserID);
}
if (User.IsInRole("Counselor"))
{
Query = Query.WhereOr(x => x.CounselorID == UserID);
}
if (User.IsInRole("Physician"))
{
Query = Query.WhereOr(x => x.PhysicianID == UserID);
}
Sie können ein Prädikat inkrementell erstellen.
Func<Pantient, bool> predicate = p => false;
if (User.IsInRole("Administrator"))
{
var oldPredicate = predicate;
predicate = p => oldPredicate(p) || p.AdministratorID == UserID;
}
if (User.IsInRole("Counselor"))
{
var oldPredicate = predicate;
predicate = p => oldPredicate(p) || p.CounselorID == UserID;
}
var query = db.Patients.Where(predicate);
würde das funktionieren
var query = Patients.Where(
x => (User.IsInRole("Administrator") && x.AdministratorID == UserID)
|| (User.IsInRole("Counselor") && x.CounselorID == UserID)
|| (User.IsInRole("Physician") && x.PhysicianID == UserID)
);