我收到了以下代码
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,但是我找不到一种方法来使它工作。有什么想法吗?
答案 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