0

我得到以下代码

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,但我找不到让它工作的方法。有任何想法吗?

4

1 回答 1

2

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

这似乎是一种倒退,但只是反转逻辑: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);
}

基本上取自这里:Lambda 表达式以及如何组合它们?

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

于 2013-04-29T08:48:48.167 回答