Where or(not and)和表达式列表c#

Where or(not and)和表达式列表c#,c#,lambda,filtering,where,iqueryable,C#,Lambda,Filtering,Where,Iqueryable,我得到了以下代码 public class Personnel { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public int OrganizationalUnitId { get; set; } public int RoleId { get; set; } } private List

我得到了以下代码

public class Personnel {
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int OrganizationalUnitId { get; set; }
    public int RoleId { get; set; }
}

private List<Expression<Func<Personnel, bool>>> personnelFilter;

public void AddFilter(Expression<Func<Personnel, bool>> filter)
{
    this.personnelFilter.Add(filter);
}

public IEnumerable<Personnel> GetResult()
{
    IQueryable<Personnel> personnel = Store.Instance.Query<Personnel>();
    foreach(var filter in this.personnelFilter)
    {
        personnel = personnel.Where(filter);
    }

    return personnel;
}
我需要以下查询:

WHERE Firstname == "Test" || Firstname == "More"
不这样做:

model.AddFilter(a => a.FirstName == "Test" || a.FirstName == "More")
这可能吗?换句话说,我得到了一个包含表达式的列表,我想用它们来代替where子句中的and,但我找不到一种方法使它起作用。有什么想法吗?

试试这样的方法:(代码不起作用)

这似乎是一种倒退,但只是一种反转逻辑:a | | B等于!(!A&&!B)。Except()是Where()的否定版本,因此您应该可以


编辑:我已经工作过了,看来你必须这样正确地组合它们:

public static Expression<Func<T, bool>> Combine_Or<T>(
    Expression<Func<T, bool>> expr1,
    Expression<Func<T, bool>> expr2)
{
    var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
    return Expression.Lambda<Func<T, bool>>
          (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
}
公共静态表达式组合\u或(
表达式expr1,
表达式expr2)
{
var invokedExpr=Expression.Invoke(expr2,expr1.Parameters.Cast());
返回表达式.Lambda
(Expression.OrElse(expr1.Body,invokedExpr),expr1.Parameters);
}
基本上取自这里:


我的完整测试代码:

什么是
表达式
?根据MSDN,它不存在()。我想这一定是我的
Func
?@Martin Mulder,更正了它,我在运行中创建了一个示例。你说你尝试了表达式。或者,但失败了。你能告诉我它失败的原因吗?缺乏知识,请参阅下面的答案,它的类型错误,但你可以轻松地将其转换为Func。数据库(引擎)应该简化表达式并!(!A&&!B)应该变成A | | B,所以我想这是一个很好的解决方案:)。。。除了只接受IENumerable,没有表达式。在我的编辑中,您需要修改表达式树以正确组合lambdas。工作非常出色!谢谢
public static Expression<Func<T, bool>> Combine_Or<T>(
    Expression<Func<T, bool>> expr1,
    Expression<Func<T, bool>> expr2)
{
    var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
    return Expression.Lambda<Func<T, bool>>
          (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
}