where或(not and)表达式列表c#

时间:2013-04-29 08:09:20

标签: 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<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;
}

它现在使用AND,因为它将Where子句附加到已经过滤的查询。但我不想将其添加为AND而是添加为OR。

所以我想说我添加过滤器:

model.AddFilter(a => a.FirstName == "Test")
model.AddFilter(a => a.FirstName == "More")

// Or adding something stupid like:
model.AddFilter(a => a.OrganizationalUnit == 1)
model.AddFilter(a => a.OrganizationalUnit == 1)

我想要以下查询:

WHERE Firstname == "Test" || Firstname == "More"

不做:

model.AddFilter(a => a.FirstName == "Test" || a.FirstName == "More")

这可能吗?换句话说,我得到了一个带有表达式的列表,我想在where子句中使用OR而不是AND,但是我找不到一种方法来使它工作。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:(代码不起作用)

这似乎是倒退,但只是反转逻辑:A || B等于!(!A&amp;&amp;!B)。除了()是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);
}

基本上从这里开始:Lambda expressions and how to combine them?

我的完整测试代码:http://pastebin.com/cLXi77pf