如何使用 LINQ 组合 (n) 个表达式?

How can I combine (n) expressions using LINQ?

我有一个包含 (n) 个动态生成的列的网格。其中一项要求是,如果显示的列之一中存在 non-null/non-zero 值,则仅在网格中显示一行。我使用的是 Infragistics XamGrid,它可以选择使用接受表达式作为其过滤条件的行过滤器。我已将列的键绑定到 MyObject 属性。

我正在尝试根据网格中显示的列生成表达式链。这是一些伪代码,展示了我正在努力完成的事情

System.Linq.Expressions.Expression<Func<MyObject, bool>> expr = product =>
{
    foreach (var p in MyGrid.Columns.Where(co => co.DataType == typeof (decimal?) && co.Visibility == Visibility.Visible))
    {
        Expression<Func<MyObject, bool>> exprInner = lrnc => ((decimal?) lrnc.GetPropValue(p.Key)) != 0.0m;
        combined = System.Linq.Expressions.Expression.OrElse(combined.Body, exprInner.Body);
    }
};

非常感谢 hatchet 和他的 link。我能够根据反映的属性动态组合表达式,为我的 XamGrid 创建 RowsFilter。

private RowsFilter m_rowsFilter;

private void CreateFilter()
{
    CustomComparisonCondition c = new CustomComparisonCondition();

    var predicate = PredicateBuilder.False<LineRatingNodeComparison>();
    foreach (string colKey in MyXamGrid.Columns.Where(co => co.DataType == typeof (decimal?) && co.Visibility == Visibility.Visible).Select(co => co.Key))
    {
        string tempKey = colKey;
        predicate = predicate.Or(p => p.GetPropValue(tempKey) != null && (decimal?) p.GetPropValue(tempKey) != 0.0m);
    }
    c.Expression = predicate;

    //Add the RowsFilter to one column that always exists on the grid.
    m_rowsFilter = new RowsFilter(typeof (MyObject), MyXamGrid.Columns.DataColumns["Company"]);
    m_rowsFilter.Conditions.Add(c);
    MyXamGrid.FilteringSettings.RowFiltersCollection.Add(m_rowsFilter);
}