Today we currently have a statement like this:
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);
}
The problem is we have Users that can have multiple roles. If a User is both an Counselor and Physician we want the system to pull back all patients where CounselorID == UserID or PhysicianID == UserID.
How can this be accomplished dynamically if we don't know what role a user will have when the page is loaded?
The current .Where clause just uses an AND statement we need an OR statment.
Ideally there would be a solution like this:
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);
}
The Dynamic source file includes a helper library that allows you to express LINQ queries using extension methods that take string arguments instead of type safe operators. To use the Dynamic Expression API, you could simply copy/paste the Dynamic source file in your project.
The Dynamic LINQ library exposes a set of extension methods on IQueryable corresponding to the standard LINQ methods at Queryable, and which accept strings in a special syntax instead of expression trees.
Predicate Builder is a powerful LINQ expression that is mainly used when too many search filter parameters are used for querying data by writing dynamic query expression. We can write a query like Dynamic SQL. To learn more about predicate delegate visit Predicate Delegate.
You can build a predicate incrementally.
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);
would this work?
var query = Patients.Where(
x => (User.IsInRole("Administrator") && x.AdministratorID == UserID)
|| (User.IsInRole("Counselor") && x.CounselorID == UserID)
|| (User.IsInRole("Physician") && x.PhysicianID == UserID)
);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With