c# - Linq Expression - 如何使用 Expression.And 正确初始化?

标签 c# linq dynamic

我正忙于在 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/

相关文章:

c# - AutoMapper 映射可为空的值类型

c# - 将一组数据行绑定(bind)到 datagridview

c# - 帮助解决 C# 泛型错误 - "The type ' T' 必须是不可为空的值类型”

c# - 哪个更快 : Union or Concat?

asp.net-mvc - Linq-to-SQL 和性能

c# - 预计长度为 2 的数组初始值设定项

c++ - QTCharts,如何让图表在实时数据进入时跟随 x 轴?

sql - 使用 Oracle 表类型执行动态 native SQL 会出现无效标识符错误

html - 具有动态大小的 CSS div 表行

c# - Linq to XML 问题