在Linq Where() lambda表达式中的“或”等效语
尝试使用PredicateBuilder作为链接:
public static class PredicateBuilder
{
public static Expression<Func<T, bool>> True<T> () { return f => true; }
public static Expression<Func<T, bool>> False<T> () { return f => false; }
public static Expression<Func<T, bool>> Or<T> (this 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);
}
public static Expression<Func<T, bool>> And<T> (this 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.AndAlso (expr1.Body, invokedExpr), expr1.Parameters);
}
}
在你的情况下:
List<string> models = new List<string>
{
"abcd1234",
"xycd9999",
"zzz999z",
"ros7777"
};
List<string> filterer = new List<string>
{
"cd",
"9999"
};
var predicate = PredicateBuilder.False<string>();
foreach (string filter in filterer)
{
predicate = predicate.Or(f => f.Contains(filter));
}
var filteredList = models.AsQueryable().Where(predicate).ToList();
PredicateBuilder
的两个原因--1)查询正在针对不支持从Contains
和Any
进行映射的提供程序运行;或2)每个字符串可能遵循自己的逻辑分支(例如,不要应用任何带有空字符串的子句;为数字字符串应用不同的谓词)。但在这种情况下,查询是在内存集合上进行的,并且过滤子句始终相同,因此我无法看到在这里使用PredicateBuilder
的好处。 - Zev Spitz