我正忙于在 IQueryable Linq 对象上编写动态 AND 过滤器,到目前为止,这是我的代码并且可以正常工作:
public static IQueryable<T> FilterHeaders<T>(this IQueryable<T> records, IEnumerable<ListHeader> headers)
{
// Build linq expression to filter queryable
if (headers != null)
{
var param = Expression.Parameter(typeof(T), "x");
var body = Expression.And(Expression.Constant(true), Expression.Constant(true));
foreach (var header in headers)
{
if (header.Filter != null && !String.IsNullOrWhiteSpace(header.Filter.Value))
{
var property = Expression.PropertyOrField(param, header.HeaderType.ToString());
var value = Expression.Constant(header.Filter.Value.Trim(), typeof(string));
body = Expression.AndAlso(body, Expression.Call(property, "Contains", null, value));
}
}
var lambda = Expression.Lambda<Func<T, bool>>(body, param);
return records.Where(lambda);
}
return records;
}
我已经用 Expression.And(Expression.Constant(true), Expression.Constant(true))
初始化了我的表达式主体。在我看来,应该有更好的方法......
如何?
最佳答案
难道你不能这样做吗:
var body = Expression.Constant(true);
请注意,您不必使用 AndAlso
仅在 And
之后,尽管名称令人困惑。
它们之间的区别很像 &
和 &&
之间的区别 - AndAlso
是逻辑 And 运算符,而 And
是位运算符。
关于c# - Linq Expression - 如何使用 Expression.And 正确初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11118562/