动态或条款Linq

Rob*_*oll 7 c# linq dynamic-linq where-clause conditional-statements

今天我们现在有一个这样的声明:

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);
}
Run Code Online (Sandbox Code Playgroud)

问题是我们有可以拥有多个角色的用户.如果用户同时是辅导员和医师,我们希望系统撤回所有患者,其中CounselorID == UserID或PhysicianID == UserID.

如果我们不知道用户在加载页面时将扮演什么角色,如何动态完成?

当前.Where子句只使用AND语句,我们需要一个OR语句.

理想情况下会有这样的解决方案:

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);
}
Run Code Online (Sandbox Code Playgroud)

dca*_*tro 14

您可以逐步构建谓词.

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);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@dcastro,这有助于我找到http://www.albahari.com/nutshell/predicatebuilder.aspx (2认同)

Den*_*s_E 7

这会有用吗?

var query = Patients.Where(
    x => (User.IsInRole("Administrator") && x.AdministratorID == UserID)
      || (User.IsInRole("Counselor") && x.CounselorID == UserID)
      || (User.IsInRole("Physician") && x.PhysicianID == UserID)
    );
Run Code Online (Sandbox Code Playgroud)