我正在忙于在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;
}
Run Code Online (Sandbox Code Playgroud)
我初始化了我的表达体Expression.And(Expression.Constant(true), Expression.Constant(true))
.在我看来,应该有一个更好的方法......
怎么样?
你不能这样做:
var body = Expression.Constant(true);
Run Code Online (Sandbox Code Playgroud)
请注意,尽管名称令人困惑,您不必AndAlso
仅使用And
.它们之间的区别是很象之间的差异&
和&&
- AndAlso
是一个逻辑与操作,并且And
是位运算符.