用于创建和筛选的 Lambda 表达式
Lambda expression to create AND filter
我使用这段代码创建了一个搜索过滤器。
我需要传递一个数据数组并通过 AND 筛选这些数据。
Expression<Func<serveis, bool>> CombineWithAnd<T>(Expression<Func<T, bool>> firstExpression, Expression<Func<T, bool>> secondExpression)
{
var parameter = Expression.Parameter(typeof(T), "z");
var resultBody = Expression.AndAlso(Expression.Invoke(firstExpression, parameter), Expression.Invoke(secondExpression, parameter));
return Expression.Lambda<Func<serveis, bool>>(resultBody, parameter);
}
然后:
Expression<Func<T, bool>> resultExpression = n => false;
foreach (var car in cars)
{
Expression<Func<T, bool>> expression = x => x.color_car.Any(z => z.car == car);
resultExpression = CombineWithAnd(resultExpression, expression);
}
query = query.Where(resultExpression.Compile());
如果我使用 OR 或 OrElse 使用相同的代码,搜索将正常工作。
但我还需要通过 AND 或 AndAlso 执行搜索,它总是 returns 零个结果。
而且我查过数据库,有 AND 和 OR 结果。
对于 AND,您应该替换开头的 "left side":
Expression<Func<T, bool>> resultExpression = n => false;
与:
Expression<Func<T, bool>> resultExpression = n => true;
因为目前无论右侧如何,左侧都不符合您的条件
我使用这段代码创建了一个搜索过滤器。
我需要传递一个数据数组并通过 AND 筛选这些数据。
Expression<Func<serveis, bool>> CombineWithAnd<T>(Expression<Func<T, bool>> firstExpression, Expression<Func<T, bool>> secondExpression)
{
var parameter = Expression.Parameter(typeof(T), "z");
var resultBody = Expression.AndAlso(Expression.Invoke(firstExpression, parameter), Expression.Invoke(secondExpression, parameter));
return Expression.Lambda<Func<serveis, bool>>(resultBody, parameter);
}
然后:
Expression<Func<T, bool>> resultExpression = n => false;
foreach (var car in cars)
{
Expression<Func<T, bool>> expression = x => x.color_car.Any(z => z.car == car);
resultExpression = CombineWithAnd(resultExpression, expression);
}
query = query.Where(resultExpression.Compile());
如果我使用 OR 或 OrElse 使用相同的代码,搜索将正常工作。
但我还需要通过 AND 或 AndAlso 执行搜索,它总是 returns 零个结果。
而且我查过数据库,有 AND 和 OR 结果。
对于 AND,您应该替换开头的 "left side":
Expression<Func<T, bool>> resultExpression = n => false;
与:
Expression<Func<T, bool>> resultExpression = n => true;
因为目前无论右侧如何,左侧都不符合您的条件